图说SQL Join

  "SQL Join的Venn图例解释"

Posted by     "华恒" on Wednesday, April 12, 2017

TOC

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

假如有两张表 Table ATable 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大致相同, 这里就不再赘述。