【SQL】连接 —— 内连接、外连接、左连接、右连接、交叉连接
连接
· 内连接
· 外连接
· 左连接
· 右连接
· 全连接
· 交叉连接
· 匹配符号(+)
连接
根据表之间的关系,呈现跨表查询的结果。
| 外连接 | |||||
| 内连接 | 左连接 | 右连接 | 全连接 | 交叉连接 | |
| 基准 | 左表 | 右表 | |||
| 显示数据 | 两表公共部分 |
左表全部 右表满足条件部分 无显示NULL |
右表全部 左表满足条件部分 无显示NULL |
左右表全部 无显示NULL |
两表所有行的组合 (笛卡尔积) |
| 关键词 | (inner) join |
(left) join |
(right) join |
full (outer) join |
cross join |
| 语法简述 | A join B on 条件 | A left join B on 条件 | A right join B on 条件 | A full join B on 条件 | A cross join B on 条件 |
就表A、表B示例
| Aid | name | age |
| 1 | Mary | 22 |
| 2 | Jack | 20 |
| Aid | name |
| 1 | Jack |
| 2 | Ma |
内连接
- 等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
- 不等值连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
- 自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
获取两表的公共部分
select * from A (inner) join B on A.name = B.name (显性内连接)
select * from A where A.name = B.name (隐性外连接)
| A_Aid | A_name | A_age | B_Bid | B_name1 |
| 1 | Jack | 22 | 1 | Jack |
外连接
左连接
以左表为基准,左表数据全部返回,右表数据只满足where条件,无显示NULL
select * from A left (outer) join B on A.name = B.name 均为全表扫描
select * from A where A.name = B.name (+) A为全表扫描,B为索引扫描,效率稍高
| A_Aid | A_name | A_age | B_Bid | B_name1 |
| 1 | Jack | 22 | 1 | Jack |
| 2 | Mary | 20 | NULL | NULL |
右连接
以右表为基准,右表数据全部返回,左表只返回满足条件的,无显示NULL
select * from A right (outer) join B on A.name = B.name
select * from A where A.name(+) = B.name
| A_Aid | A_name | A_age | B_Bid | B_name1 |
| 1 | Jack | 22 | 1 | Jack |
| NULL | NULL | NULL | 2 | Ma |
全连接
显示两表全部数据,完整外部联接返回左表和右表中的所有行。
当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。
如果表之间有匹配行,则整个结果集行包含基表的数据值。
select * from A full (outer) join B on A.name = B.name
| A_Aid | A_name | A_age | B_Bid | B_name1 |
| 1 | Jack | 22 | 1 | Jack |
| 2 | Mary | 20 | NULL | NULL |
| NULL | NULL | NULL | 2 | Ma |
交叉连接
将两个表的所有行进行组合,连接后的行数为两个表的乘积数。(笛卡尔积)
select * from A cross join B
| A_Aid | A_name | A_age | B_Bid | B_name1 |
| 1 | Jack | 22 | 1 | Jack |
| 1 | Jack | 22 | 2 | Ma |
| 2 | Mary | 20 | 1 | Jack |
| 2 | Mary | 20 | 2 | Ma |
匹配符号
对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
3.(+)操作符只适用于列,而不能用在表达式上。
4.(+)操作符不能与or和in操作符一起使用。
5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
一句话记忆:+号在哪里,就是匹配表
【SQL】连接 —— 内连接、外连接、左连接、右连接、交叉连接的更多相关文章
- [转] 如何设置双网卡同时连接内网外网_bpao_新浪博客
已剪辑自: http://blog.sina.com.cn/s/blog_5d3e229c0100skwe.html 如何设置双网卡同时连接内网外网 . 通过无线网络连接外网,确保连接成功后开始第二步 ...
- SQL-内连接、外连接(左、右)、交叉连接
本文测试基于以下两个表,student(左) \ teacher(右),使用数据库MariaDB,图形化界面HeidiSQL. 连接查询的概念:根据两个表或多个表的列之间的关系,从这些表中查询数据,即 ...
- 配置windows路由表,使电脑同时连接内网外网方法
1.环境一(系统:windows xp,内网.外网不是同一类地址,内网地址固定): 外网:通过笔记本的无线网卡连接: 内网:通过笔记本的本地连接: 第一步,连接网线,配置本地连接地址,注意IP地址不要 ...
- 【转】配置windows路由表,使电脑同时连接内网外网方法
1. 公司内部,内网和外网的网关不一样,怎么样让电脑可以同时上内网和外网呢? 来一张不相关的磁盘结构图: ----------------------------------------------- ...
- C++ class内的 ++ 重载,左++,右++,重载示例。
#include <iostream> // overloading "operator ++ " inside class // ++ 是一元操作符 //////// ...
- SQL: 左连接,右连接,内连接,左外连接,右外连接,完全连接
例子: ---------------------- --------------------------- a表 id name b表 id job parent_id 1 张三 ...
- 【转】SQL中内连接和外连接
如表 ------------------------------------------------- table1 | table2 | ----------------- ...
- SQL中内连接和外连接的问题!
本文系转载,版权归原作者所有. 如表 ------------------------------------------------- table1 | table2 | ...
- SQL Server中的连接查询【内连接,左连接,右连接,。。。】
在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...
- SQL Server内连接、外连接、交叉连接
前言 在数据库查询中,我们常常会用到的表连接查询,而我自己在工作中也是时常用这些表连接查询.而就在刚刚我却还没有搞清楚数据库表连接到底有哪几种, 这几种表连接查询方式又有什么区别,实属惭愧!借以此文以 ...
随机推荐
- 退役or延期退役
究竟是\(150\)天后退役,还是能继续续命呢? 一切看自己了!加油!\(cyh\)!千万不要败在别人的只言片语之下啊!
- java 正则简单使用
查找是否包含字串 查询是否包含 #{name} 片段 这里有包含所以返回true String context = "select * from t_user where (name = # ...
- POJ1021 2D-Nim
题目来源:http://poj.org/problem?id=1021 题目大意: 有一种在棋盘上玩的游戏,每一步,一个玩家可以从棋盘上拿走连续行或列的棋子.谁拿到最后一颗棋子就胜利.如下图所示的棋盘 ...
- Unity 行为树-节点间数据传递
一.引言 有以下小场景: 节点A:发现了 敌人. 节点B:追逐敌人. 对于同一个敌人物体,节点AB之间是如何传递数据 的呢? 二.数据传递的3种方式 1.共享变量:面板中创建局部或者全局的共享变量Te ...
- Python+Selenium----使用HTMLTestRunner.py生成自动化测试报告1(使用IDLE)
1.说明 自动化测试报告是一个很重要的测试数据,网上看了一下,使用HTMLTestRunner.py生成自动化测试报告使用的比较多,但是呢,小白刚刚入手,不太懂,看了很多博客,终于生成了一个测试报告, ...
- 转 安装EBS前期检查工具 - RDA - Health Check / Validation Engine Guide
http://blog.itpub.net/35489/viewspace-1295028/ 参考文档 RDA - Health Check / Validation Engine Gu ...
- varnish与squid的比较
生产环境中尝试使用varnish替代squid的主要原因: 1. squid不支持多核cpu, 生产环境中大多使用Dell R610系列,这种类型机器配置为2个4核双线程cpu, 操作系统识别为16个 ...
- SpringBoot | 第二十二章:定时任务的使用
前言 上两章节,我们简单的讲解了关于异步调用和异步请求相关知识点.这一章节,我们来讲讲开发过程也是经常会碰见的定时任务.比如每天定时清理无效数据.定时发送短信.定时发送邮件.支付系统中的定时对账等等, ...
- 在C#中,为什么大家用httpcontext.current,不直接用HttpContext
HttpContext只是个类名,HttpContext.Current才是一个已实例化的对象..比如这样一个类: class A{ public static A Current{get;set;} ...
- Josn转换
也是搬的,大家勿喷,贴出来只为了自己记忆查找 需要引用 System.Web.Extensions.dll 这个类库 命名空间: System.Web.Script.Serialization 数据结 ...