歡迎光臨
每天分享高質量文章

畫圖解釋 SQL join 陳述句

我認為 Ligaya Turmelle 的關於SQL聯合(join)陳述句的帖子對於新手開發者來說是份很好的材料。SQL 聯合陳述句好像是基於集合的,用韋恩圖來解釋咋一看是很自然而然的。不過正如在她的帖子的回覆中所說的,在測試中我發現韋恩圖並不是十分的匹配SQL聯合語法。

不過我還是喜歡這個觀點,所以我們來看看能不能用上韋恩圖。假設我們有下麵兩張表。表A在左邊,表B在右邊。我們給它們各四條記錄。

1
2
3
4
5
6
id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja

我們用過name欄位用幾種不同方式把這些表聯合起來,看能否得到和那些漂亮的韋恩圖在概念上的匹配。

1
2
3
4
5
6
7
8
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 Ninja

行內合(inner join)只生成同時匹配表A和表B的記錄集。(如下圖)

——————————————————————————-

1
2
3
4
5
6
7
8
9
10
11
12
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

全外聯合(full outer join)生成表A和表B里的記錄全集,包括兩邊都匹配的記錄。如果有一邊沒有匹配的,缺失的這一邊為null。(如下圖)

——————————————————————————-

1
2
3
4
5
6
7
8
9
10
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

左外聯合(left outer join)生成表A的所有記錄,包括在表B里匹配的記錄。如果沒有匹配的,右邊將是null。(如下圖)

——————————————————————————-

1
2
3
4
5
6
7
8
9
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里的記錄集,我們用同樣的左外聯合,然後用where陳述句排除我們不想要的記錄。(如下圖)

——————————————————————————-

1
2
3
4
5
6
7
8
9
10
11
12
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唯一的記錄集,我們用同樣的全外聯合,然後用where陳述句排除兩邊都不想要的記錄。(如下圖)

———————————————————–

還有一種笛卡爾積或者交叉聯合(cross join),據我所知不能用韋恩圖表示:

1
2
SELECT * FROM TableA
CROSS JOIN TableB

這個把“所有”聯接到“所有”,產生4乘4=16行,遠多於原始的集合。如果你學過數學,你便知道為什麼這個聯合遇上大型的表很危險。

【更新】下圖由 Moffatt 在 2008 年製作(點擊可查看大圖)。PS:Jeff Atwood 的文章寫於 2007 年。

英文原文;Jeff Atwood

編譯:伯樂在線 – @奇風餘谷

譯文鏈接:http://blog.jobbole.com/40443/


赞(0)

分享創造快樂