EN中文

图说SQL Join

本文通过维恩图直观演示SQL中Left Join、Right Join、Inner Join、Full Outer Join等各种Join操作的执行效果。

  • Ryan
  • 阅读 2 分钟
/images/posts/sql-joins-venn.png

如果你也曾经被SQL语言中各种Join操作:Left Join, Right Join, Inner Join等搞晕了头,那么这篇文章比较适合你。本文通过维恩图演示各种Join语句的执行效果,简单直白容易记忆。原文见

假如有两张表 Table ATable B, 表数据如下: Table A:

idname
1Pirate
2Monkey
3Ninja
4Spaghetti

Table B:

idname
1Rutabaga
2Pirate
3Darth Vader
4Ninja

下面我们来看看各种Join的执行效果

1. INNER JOIN

Inner Join会根据Join的On条件拿左表(Table A)的行与右表(Table B)的行进行匹配, 只有当左右表中 至少同时 存在一条匹配数据时才返回到结果集. 也就是说Inner Join求的是两个表之间的交集.

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

结果集:

idnameidname
1Pirate2Pirate
2Ninja4Ninja

2. Full JOIN

在某些数据库中, FULL JOIN被称之为FULL OUTER JOIN (注意: MySQL不支持带ON条件的FULL JOIN, 也不支持FULL OUTER JOIN关键字). FULL OUTER JOIN关键字会从左表(Table A)和右表(Table B)中返回所有符合条件的行, 如果Table A中的行在Table B中没有匹配或者Table B中的行在Table A中没有匹配, 则相关列返回NULL.

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name

结果集:

idnameidname
1Pirate2Pirate
2Monkeynullnull
3Ninja4Ninja
4Spaghettinullnull
nullnull1Rutabaga
nullnull3Darth Vader

另外一个例子:

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

结果集:

idnameidname
2Monkeynullnull
4Spaghettinullnull
nullnull1Rutabaga
nullnull3Darth Vader

3. LEFT JOIN

LEFT JOIN在某些数据库中称之为LEFT OUTER JOIN. 该关键字会从左表中返回所有符合条件的行, 并且如果右表有匹配的行则一并返回, 如果右表中没找到匹配的行, 则与右表相关的结果列返回NULL

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

结果集:

idnameidname
1Pirate2Pirate
2Monkeynullnull
3Ninja4Ninja
4Spaghettinullnull

另外一个例子:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

结果集:

idnameidname
2Monkeynullnull
4Spaghettinullnull

4. RIGHT JOIN

RIGHT JOIN在某些数据库中称之为RIGHT OUTER JOIN, 与LEFT JOIN相反, 该关键字返回右表中所有符合条件的行, 并且如果左表有匹配的行则一并返回, 如果左表没找到匹配的行, 则与左表相关的结果列返回NULL。

由于RIGHT JOIN的原理与LEFT JOIN大致相同, 这里就不再赘述。

Frequently Asked Questions

INNER JOIN 和 LEFT JOIN 有什么区别?
INNER JOIN 只返回两张表中都有匹配值的行。LEFT JOIN 返回左表的所有行,以及右表中匹配的行。如果没有匹配,右侧列的值为 NULL。
什么时候用 FULL OUTER JOIN?
当你需要保留两张表的所有行,不管是否匹配时使用。未匹配的行用 NULL 填充。常用于数据对账和差异分析。
RIGHT JOIN 和 LEFT JOIN 实际使用有区别吗?
功能上 A RIGHT JOIN B 等价于 B LEFT JOIN A,只是列顺序不同。大多数开发者偏好 LEFT JOIN,因为“保留表”始终在左侧,可读性更好。

Written by : Ryan

Writing about distributed systems, AI engineering, and production internals.

Recommended for You