畫圖解釋SQL聯合語句


我認爲 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

inner join

——————————————————————————-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。(以下圖)開發

Full outer join

——————————————————————————-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。(以下圖)數學

Left outer join

——————————————————————————-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行,遠多於原始的集合。若是你學過數學,你便知道爲何這個聯合趕上大型的表很危險。

相關文章
相關標籤/搜索