图解 SQL 多表连接语法(JOIN):一句话也能看懂的连接方式全解析!
适合 SQL 初学者、中级开发者以及数据分析师快速理解 SQL 的 JOIN 操作。
一、前言
在数据库开发、数据分析与数据挖掘中,我们经常需要将多个表的数据进行关联,这就是所谓的“多表连接”。在 SQL 中,我们通过 JOIN
语句来实现这一操作。
然而,很多初学者在学习 JOIN 语法时会感到非常困惑,不清楚各类 JOIN 的本质区别。今天,我们通过一张可视化图解,一次性搞懂所有主流 SQL JOIN 类型。
二、JOIN 的基本类型图示
我们先来看图(如下),图中展示了 5 种常见的 JOIN 类型:
图注:此为 SQL 的多表连接语句
图中用 A 表和 B 表两个集合表示两个数据表,绿色阴影部分表示 JOIN 操作选中的数据区域。
三、JOIN 类型逐一详解
1. LEFT JOIN(左连接)
图示:
绿色部分为 A 表中所有记录,无论它们是否与 B 表中的记录匹配。
语法:
SELECT *
FROM A
LEFT JOIN B
ON A.id = B.id;
说明:
-
取出 A 表中的全部记录;
-
如果 A 表中的记录在 B 表中有匹配,就显示 B 表的内容;
-
如果没有匹配,B 表字段为 NULL。
2. RIGHT JOIN(右连接)
图示:
绿色部分为 B 表中所有记录,无论它们是否与 A 表中的记录匹配。
语法:
SELECT *
FROM A
RIGHT JOIN B
ON A.id = B.id;
说明:
与 LEFT JOIN 相反:
-
取出 B 表中的全部记录;
-
如果 B 表中的记录在 A 表中有匹配,就显示 A 表的内容;
-
没有匹配时,A 表字段为 NULL。
3. INNER JOIN(内连接)
图示:
只选中 A 和 B 表中都存在匹配的记录,也就是图中交集的部分。
语法:
SELECT *
FROM A
INNER JOIN B
ON A.id = B.id;
说明:
-
只返回两张表中符合连接条件的记录;
-
没有匹配的行会被丢弃;
-
最常用的 JOIN 类型。
4. OUTER JOIN(全外连接)
图示:
A 表和 B 表中所有记录都被保留,即图中两个圆形的并集部分。
语法(部分数据库支持 FULL OUTER JOIN):
SELECT *
FROM A
FULL OUTER JOIN B
ON A.id = B.id;
说明:
-
所有记录都会被保留;
-
没有匹配的部分用 NULL 填充;
-
并不是所有数据库(如 MySQL)都支持 FULL OUTER JOIN。
5. OUTER MINUS INNER(外连接减去内连接)
图示:
只显示左右两边不相交的部分,即只显示没有匹配的 A 或 B 的数据。
在 SQL 中等价于:
-- LEFT 表未匹配部分
SELECT *
FROM A
LEFT JOIN B ON A.id = B.id
WHERE B.id IS NULL
UNION
-- RIGHT 表未匹配部分
SELECT *
FROM B
LEFT JOIN A ON A.id = B.id
WHERE A.id IS NULL;
说明:
-
常用于查找“只在一张表中存在”的记录;
-
是
FULL OUTER JOIN - INNER JOIN
的效果实现方式。
四、总结:对比一览表
JOIN 类型 | 是否保留A中未匹配项 | 是否保留B中未匹配项 | 是否保留匹配项 |
---|---|---|---|
INNER JOIN | 否 | 否 | 是 |
LEFT JOIN | 是 | 否 | 是 |
RIGHT JOIN | 否 | 是 | 是 |
FULL OUTER JOIN | 是 | 是 | 是 |
OUTER MINUS INNER | 是(非匹配) | 是(非匹配) | 否 |
五、实用建议
-
初学者建议优先掌握
INNER JOIN
和LEFT JOIN
; -
在实际项目中,很多数据分析需求是“查询 A 表中有哪些数据没有匹配到 B 表”,这时候就用
LEFT JOIN + WHERE B.xx IS NULL
; -
为提高效率,JOIN 时注意对连接字段建立索引。
六、结语
通过一张图,你是否对 JOIN 的世界豁然开朗了?无论你是开发者还是数据分析师,掌握 JOIN 是通向高级 SQL 的必经之路。