原文:图说SQL Join
如果你也曾经被SQL语言中各种Join操作:Left Join, Right Join, Inner Join等搞晕了头,那么这篇文章比较适合你。本文通过维恩图演示各种Join语句的执行效果,简单直白容易记忆。
假如有两张表 Table A 和 Table B, 表数据如下:
Table A:
id | name |
---|---|
1 | Pirate |
2 | Monkey |
3 | Ninja |
4 | Spaghetti |
Table B:
id | name |
---|---|
1 | Rutabaga |
2 | Pirate |
3 | Darth Vader |
4 | Ninja |
下面我们来看看各种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
结果集:
id | name | id | name |
---|---|---|---|
1 | Pirate | 2 | Pirate |
2 | Ninja | 4 | Ninja |

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
结果集:
id | name | id | name |
---|---|---|---|
1 | Pirate | 2 | Pirate |
2 | Monkey | null | null |
3 | Ninja | 4 | Ninja |
4 | Spaghetti | null | null |
null | null | 1 | Rutabaga |
null | null | 3 | Darth Vader |

另外一个例子:
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null
结果集:
id | name | id | name |
---|---|---|---|
2 | Monkey | null | null |
4 | Spaghetti | null | null |
null | null | 1 | Rutabaga |
null | null | 3 | Darth Vader |

3. LEFT JOIN
LEFT JOIN在某些数据库中称之为LEFT OUTER JOIN. 该关键字会从左表中返回所有符合条件的行, 并且如果右表有匹配的行则一并返回, 如果右表中没找到匹配的行, 则与右表相关的结果列返回NULL
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
结果集:
id | name | id | name |
---|---|---|---|
1 | Pirate | 2 | Pirate |
2 | Monkey | null | null |
3 | Ninja | 4 | Ninja |
4 | Spaghetti | null | null |

另外一个例子:
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
结果集:
id | name | id | name |
---|---|---|---|
2 | Monkey | null | null |
4 | Spaghetti | null | null |

4. RIGHT JOIN
RIGHT JOIN在某些数据库中称之为RIGHT OUTER JOIN, 与LEFT JOIN相反, 该关键字返回右表中所有符合条件的行, 并且如果左表有匹配的行则一并返回, 如果左表没找到匹配的行, 则与左表相关的结果列返回NULL。
由于RIGHT JOIN的原理与LEFT JOIN大致相同, 这里就不再赘述。
网友评论
应该还有 across join,笛卡尔集的概念这篇文章 就完美了。