原文:圖說SQL Join
如果你也曾經(jīng)被SQL語言中各種Join操作:Left Join, Right Join, Inner Join等搞暈了頭,那么這篇文章比較適合你。本文通過維恩圖演示各種Join語句的執(zhí)行效果,簡單直白容易記憶。
假如有兩張表 Table A 和 Table B, 表數(shù)據(jù)如下:
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的執(zhí)行效果
1. INNER JOIN
Inner Join會(huì)根據(jù)Join的On條件拿左表(Table A)的行與右表(Table B)的行進(jìn)行匹配, 只有當(dāng)左右表中 至少同時(shí) 存在一條匹配數(shù)據(jù)時(shí)才返回到結(jié)果集. 也就是說Inner Join求的是兩個(gè)表之間的交集.
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
結(jié)果集:
| id | name | id | name |
|---|---|---|---|
| 1 | Pirate | 2 | Pirate |
| 2 | Ninja | 4 | Ninja |

2. Full JOIN
在某些數(shù)據(jù)庫中, FULL JOIN被稱之為FULL OUTER JOIN (注意: MySQL不支持帶ON條件的FULL JOIN, 也不支持FULL OUTER JOIN關(guān)鍵字). FULL OUTER JOIN關(guān)鍵字會(huì)從左表(Table A)和右表(Table B)中返回所有符合條件的行, 如果Table A中的行在Table B中沒有匹配或者Table B中的行在Table A中沒有匹配, 則相關(guān)列返回NULL.
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
結(jié)果集:
| 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 |

另外一個(gè)例子:
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null
結(jié)果集:
| 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在某些數(shù)據(jù)庫中稱之為LEFT OUTER JOIN. 該關(guān)鍵字會(huì)從左表中返回所有符合條件的行, 并且如果右表有匹配的行則一并返回, 如果右表中沒找到匹配的行, 則與右表相關(guān)的結(jié)果列返回NULL
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
結(jié)果集:
| id | name | id | name |
|---|---|---|---|
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | null | null |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | null | null |

另外一個(gè)例子:
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
結(jié)果集:
| id | name | id | name |
|---|---|---|---|
| 2 | Monkey | null | null |
| 4 | Spaghetti | null | null |

4. RIGHT JOIN
RIGHT JOIN在某些數(shù)據(jù)庫中稱之為RIGHT OUTER JOIN, 與LEFT JOIN相反, 該關(guān)鍵字返回右表中所有符合條件的行, 并且如果左表有匹配的行則一并返回, 如果左表沒找到匹配的行, 則與左表相關(guān)的結(jié)果列返回NULL。
由于RIGHT JOIN的原理與LEFT JOIN大致相同, 這里就不再贅述。