【漫话机器学习系列】267.JOINS

138 阅读3分钟

图解 SQL 多表连接语法(JOIN):一句话也能看懂的连接方式全解析!

适合 SQL 初学者、中级开发者以及数据分析师快速理解 SQL 的 JOIN 操作。


一、前言

在数据库开发、数据分析与数据挖掘中,我们经常需要将多个表的数据进行关联,这就是所谓的“多表连接”。在 SQL 中,我们通过 JOIN 语句来实现这一操作。

然而,很多初学者在学习 JOIN 语法时会感到非常困惑,不清楚各类 JOIN 的本质区别。今天,我们通过一张可视化图解,一次性搞懂所有主流 SQL JOIN 类型。


二、JOIN 的基本类型图示

我们先来看图(如下),图中展示了 5 种常见的 JOIN 类型:

267.jpg 图注:此为 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是(非匹配)是(非匹配)

五、实用建议

  1. 初学者建议优先掌握 INNER JOINLEFT JOIN
  2. 在实际项目中,很多数据分析需求是“查询 A 表中有哪些数据没有匹配到 B 表”,这时候就用 LEFT JOIN + WHERE B.xx IS NULL
  3. 为提高效率,JOIN 时注意对连接字段建立索引。

六、结语

通过一张图,你是否对 JOIN 的世界豁然开朗了?无论你是开发者还是数据分析师,掌握 JOIN 是通向高级 SQL 的必经之路。

欢迎点赞、收藏和转发这篇文章,一起用图说话,把抽象的 SQL 玩出花!