圖解 SQL join 語句

假設咱們有下面兩張表。表A在左邊,表B在右邊。咱們給它們各四條記錄。sql

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

 
咱們用過name字段用幾種不一樣方式把這些表聯合起來,看可否獲得和那些漂亮的韋恩圖在概念上的匹配。
 spa

內聯合(inner join)

只生成同時匹配表A和表B的記錄集。(以下圖)
inner joincode

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

全外聯合(full outer join)

生成表A和表B裏的記錄全集,包括兩邊都匹配的記錄。若是有一邊沒有匹配的,缺失的這一邊爲null。(以下圖)
Full outer joincdn

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

左外聯合(left outer join)

生成表A的全部記錄,包括在表B裏匹配的記錄。若是沒有匹配的,右邊將是null。(以下圖)
Left outer joinblog

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

爲了生成只在表A裏而不在表B裏的記錄集,咱們用一樣的左外聯合,而後用where語句排除咱們不想要的記錄。(以下圖)
WHERE TableB.id IS nulrem

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語句排除兩邊都不想要的記錄。(以下圖)
 
WHERE TableA.id IS nullget

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

笛卡爾積 (交叉聯合(cross join))

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

SELECT * FROM TableA
CROSS JOIN TableB

 
這個把「全部」聯接到「全部」,產生4乘4=16行,遠多於原始的集合。若是你學過數學,你便知道爲何這個聯合趕上大型的表很危險。
 
【2013-06-17 更新】下圖由 Moffatt 在 2008 年製做(點擊可查看大圖)。PS:Jeff Atwood 的文章寫於 2007 年。
SQL Joins
 it

https://blog.codinghorror.com...io

相關文章
相關標籤/搜索