標籤:blog http color os strong width
——轉載
假設我們有下面兩張表。表A在左邊,表B在右邊。我們給它們各四條記錄。
| 123456 |
id name id name-- ---- -- ----1 Pirate 1 Rutabaga2 Monkey 2 Pirate3 Ninja 3 Darth Vader4 Spaghetti 4 Ninja |
我們用過name欄位用幾種不同方式把這些表聯合起來,看能否得到和那些漂亮的韋恩圖在概念上的匹配。
| 12345678 |
SELECT * FROM TableAINNER JOIN TableBON TableA.name = TableB.name id name id name-- ---- -- ----1 Pirate 2 Pirate3 Ninja 4 Ninja |
內聯合(inner join)只產生同時匹配表A和表B的記錄集。(如)
——————————————————————————-
| 123456789101112 |
SELECT * FROM TableAFULL OUTER JOIN TableBON TableA.name = TableB.name id name id name-- ---- -- ----1 Pirate 2 Pirate2 Monkey null null3 Ninja 4 Ninja4 Spaghetti null nullnull null 1 Rutabaga null null 3 Darth Vader |
全外聯合(full outer join)產生表A和表B裡的記錄全集,包括兩邊都匹配的記錄。如果有一邊沒有匹配的,缺失的這一邊為null。(如)
——————————————————————————-
| 12345678910 |
SELECT * FROM TableALEFT OUTER JOIN TableBON TableA.name = TableB.name id name id name-- ---- -- ----1 Pirate 2 Pirate2 Monkey null null3 Ninja 4 Ninja4 Spaghetti null null |
左外聯合(left outer join)產生表A的所有記錄,包括在表B裡匹配的記錄。如果沒有匹配的,右邊將是null。(如)
——————————————————————————-
| 123456789 |
SELECT * FROM TableALEFT OUTER JOIN TableBON TableA.name = TableB.nameWHERE TableB.id IS null id name id name-- ---- -- ----2 Monkey null null4 Spaghetti null null |
為了產生只在表A裡而不在表B裡的記錄集,我們用同樣的左外聯合,然後用where語句排除我們不想要的記錄。(如)
——————————————————————————-
| 123456789101112 |
SELECT * FROM TableAFULL OUTER JOIN TableBON TableA.name = TableB.nameWHERE TableA.id IS null OR TableB.id IS null id name id name-- ---- -- ----2 Monkey null null4 Spaghetti null nullnull null 1 Rutabaganull null 3 Darth Vader |
為了產生對於表A和表B唯一的記錄集,我們用同樣的全外聯合,然後用where語句排除兩邊都不想要的記錄。(如)
———————————————————–
還有一種笛卡爾積或者交叉聯合(cross join),據我所知不能用韋恩圖表示:
| 12 |
SELECT * FROM TableACROSS JOIN TableB |
這個把“所有”聯結到“所有”,產生4乘4=16行,遠多於原始的集合。如果你學過數學,你便知道為什麼這個聯合遇上大型的表很危險。
【2013-06-17 更新】由 Moffatt 在 2008 年製作(點擊可查看大圖)。PS:Jeff Atwood 的文章寫於 2007 年。
譯文連結:http://blog.jobbole.com/40443/