對於SQL的Join,在學習起來可能是比較亂的。我們知道,SQL的Join語法有很多inner的,有outer的,有left的,有時候,對於Select出來的結果集是什麼樣子有點不是很清楚。Coding Horror上有一篇文章(實在不清楚為什麼Coding Horror也被牆)通過 文氏圖 Venn diagrams 解釋了SQL的Join。我覺得清楚易懂,轉過來。
假設我們有兩張表。
Table A 是左邊的表。
Table B 是右邊的表。
其各有四條記錄,其中有兩條記錄是相同的,如下所示:
復制代碼 代碼如下:
id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja
下面讓我們來看看不同的Join會產生什麼樣的結果。
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 NinjaInner join
產生的結果集中,是A和B的交集。
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 VaderFull outer join 產生A和B的並集。但是需要注意的是,對於沒有匹配的記錄,則會以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 nullLeft outer join 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以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產生在A表中有而在B表中沒有的集合。
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產生A表和B表都沒有出現的數據集。