SQL的各种连接Join详解

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)、SQL LEFT JOIN、SQL RIGHT JOIN、SQL FULL JOIN,其中前一种是内连接,后三种是外链接。

假设我们有两张表,Table A是左边的表,Table B是右边的表。

id name
1 Google
2 淘宝
3 微博
4 Facebook
id address
1 美国
5 中国
3 中国
6 美国












INNER JOIN

内连接是最常见的一种连接,只连接匹配的行。

inner join语法

select column_name(s)
from table 1
INNER JOIN table 2
ON table 1.column_name=table 2.column_name

注释:INNER JOIN与JOIN是相同

INNER JOIN产生的结果集中,是1和2的交集。

用上边的Table A和Table B举个栗子:

select * from Table A inner join Table B
on Table A.id=Table B.id

输出结果如下:

id name address
1 Google 美国
3 微博 中国








LEFT JOIN

LEFT JOIN返回左表的全部行和右表满足ON条件的行如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替

LEFT JOIN 语法

select column_name(s)
from table 1
LEFT JOIN table 2
ON table 1.column_name=table 2.column_name

注释:在某些数据库中,LEFT JOIN 称为LEFT OUTER JOIN

select * from Table A left join Table B
on Table A.id=Table B.id

执行以上SQL输出结果如下:

id name address
1 Google 美国
2 淘宝 null
3 微博 中国
4 Facebook null












RIGHT [OUTER] JOIN

RIGHT OUTERJOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。

FULL OUTER JOIN

FULL JOIN 会从 左表 和 右表 那里返回所有的行。如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数据用NULL代替。

FULL OUTER JOIN 语法

select column_name(s)
from table 1
FULL OUTER JOIN table 2
ON table 1.column_name=table 2.column_name

FULL OUTER JOIN产生1和2的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。

select * from Table A full outer join Table B
on Table A.id=Table B.id

执行以上SQL输出结果如下:

id name address
1 Google 美国
2 淘宝 null
3 微博 中国
4 Facebook null
5 null 中国
6 null 美国
















UNION 与 UNION ALL

参考整理:https://zhuanlan.zhihu.com/p/59656673

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。

举个栗子,左边为TableA,右边为TableB:

UNION

SELECT name FROM TableA UNION SELECT name FROM TableB

结果为:

UNION选取不同值,会合并相同的字段

UNION ALL

SELECT name FROM TableA UNION ALL SELECT name FROM TableB

结果为:

UNION ALL把所有记录全部列出来,重复的也会

注意

SELECT * FROM TableA UNION SELECT * FROM TableB

结果为:

由于 id 1 Pirate 与 id 2 Pirate 并不相同,不合并

笛卡尔积(cross join)

还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

SELECT * FROM TableA CROSS JOIN TableB

这个笛卡尔乘积会产生 4 x 4 = 16 条记录,一般来说,我们很少用到这个语法。但是我们得小心,如果不是使用嵌套的select语句,一般系统都会产生笛卡尔乘积然再做过滤。这是对于性能来说是非常危险的,尤其是表很大的时候。

总结

Hash Join

这是join底层实现,有兴趣的话可以跳转学习:

MySQL 8.0 新特性之哈希连接:https://zhuanlan.zhihu.com/p/88900956


   转载规则


《SQL的各种连接Join详解》 锦泉 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录