我認爲 Ligaya Turmelle 的關於SQL聯合(join)語句的帖子對於新手開發者來講是份很好的材料。SQL 聯合語句好像是基於集合的,用韋恩圖來解釋咋一看是很天然而然的。不過正如在她的帖子的回覆中所說的,在測試中我發現韋恩圖並非十分的匹配SQL聯合語 法。測試
不過我仍是喜歡這個觀點,因此咱們來看看能不能用上韋恩圖。假設咱們有下面兩張表。表A在左邊,表B在右邊。咱們給它們各四條記錄。spa
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字段用幾種不一樣方式把這些表聯合起來,看可否獲得和那些漂亮的韋恩圖在概念上的匹配。code
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的記錄集。(以下圖)cdn
——————————————————————————-ci
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。(以下圖)開發
——————————————————————————-get
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。(以下圖)數學
——————————————————————————-it
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語句排除咱們不想要的記錄。(以下圖)table
——————————————————————————-
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行,遠多於原始的集合。若是你學過數學,你便知道爲何這個聯合趕上大型的表很危險。