【简介】: 在关系型数据库中,表跟表之间的 连接查询(区别于 联合查询),
主要分为3大种:内连接、外连接、交叉连接。
其中内连接分为3小种:等值连接、自然连接、不等连接。
其中外连接分为3小种:左连接(也叫左外连接)、右连接(也叫右外连接)、全连接(也叫全外连接)。
一、内连接(inner join)
1.1 等值连接
(1)语法
- inner join…on… / join…on…
(2)示例(select *)
- select * from tableA inner join tableB on tableA .id = tableB .id;
(3)图释
(4)解释
- 在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
1.2自然连接
(2)示例(select 指定的列)
- select tableA .id,tableA .name, tableB.address from tableA inner join tableB on tableA .id = tableB .id;
(4)解释
- 在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
1.3不等连接
(4)解释
- 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
在内连接中:等值连接用的最多。自然连接 和 不等连接用的少。
二、外连接(outer join)
2.1 左连接(左外连接)
(1)语法
- left join…on… / left outer join…on…
(2-1)示例
- select t1.* ,t2.* from t1 left join t2 on t1 .id = t2 .id; (两个表)
- select t1.* , t2.* , t3.* from t1 left join t2 on t1 .id = t2 .id left join t3 on t2.id= t3.id; (三个表)
(2-2)示例( “(+)” 来表示)
-
select * from t1 a , t2 b where a.id=b.id(+); (两个表)
-
如何记忆:用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在右表,左表就是全部显示,所以是左连接。
(3)图解
(4)解释
- 左表有就显示,不论右表。以左表为主表,右表没数据为null。
- LEFT JOIN 返回 左表的所有记录 以及 右表中与左表联结字段相等的记录;
2.2 右连接(右外连接)
(1)语法
- right join…on… / right outer join…on…
(2-1)示例
- select t1.* ,t2.* from t1 right join t2 on t1 .id = t2 .id; (两个表)
- select t1.* , t2.* , t3.* from t1 right join t2 on t1 .id = t2 .id right join t3 on t2.id= t3.id; (三个表)
(2-2)示例(“+”来表示)
-
select * from t1 a , t2 b where a.id(+)=b.id; (两个表)
-
如何记忆:用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在左表,右表就是全部显示,所以是右连接。
(3)图解
(4)解释
- 右表有就显示,不论左表。以右表为主表,左表没数据为null。
- RIGHT JOIN 返回 右表的所有记录 以及 左表中与右表联结字段相等的记录;
2.3 全连接(全外连接)
(1)语法
- full join…on… / full outer join…on…
(2)示例(不支持“+”)
- select * from tableA full join tableB on tableA .id = tableB .id;
(3)图解
(4)解释
- 显示两个表符合条件的数据
- FULL JOIN 返回 两个表符合条件的所有记录 ,两表不足的地方均为NULL。
【注意】:Oracle数据库支持full join,mysql是不支持full join的,但可以同过左外连接+ union+右外连接 组合来实现。
如:select * from t1 left join t2 on t1.id = t2.id
union
select * from t1 right join t2 on t1.id = t2.id;
三、交叉连接(cross join)
3.1 交叉连接(又名笛卡尔积)
- 把表A和表B的数据进行一个N*M的组合,即笛卡尔积,使用较少,后面不能跟ON关键字;
学习交叉连接的链接
四、联合查询(区别于上面的一、二、三)
4.1 联合查询是 连接查询吗?
(1)上面的一(内连接)、二(外连接)、三(交叉连接) 都属于连接查询,
跟联合查询不是一个意思。所以联合查询不是连接查询。
4.2 联合查询是什么?
(1)语法
- select … union select …
- select … union all select …
(2)示例
- select A.id from A UNION select B.id from B;
- select A.id from A UNION ALL select B.id from B;
(3)解释
-
UNION 不会展示重复的结果
-
UNION ALL 所有的结果都会展示出来。
【注意】:
UNION操作符用于合并两个或多个SELECT语句的结果集,
这里需要注意的是:UNION内部的SELECT语句必须拥有相同数量的列,列也必须拥有相似的数据类型,
同时,每条SELECT语句中列的顺序必须相同。