假設咱們有下面兩張表。表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
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- 1 Pirate 2 Pirate 3 Ninja 4 Ninja
生成表A和表B裏的記錄全集,包括兩邊都匹配的記錄。若是有一邊沒有匹配的,缺失的這一邊爲null。(以下圖)cdn
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
生成表A的全部記錄,包括在表B裏匹配的記錄。若是沒有匹配的,右邊將是null。(以下圖)blog
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語句排除咱們不想要的記錄。(以下圖)rem
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語句排除兩邊都不想要的記錄。(以下圖)
get
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),據我所知不能用韋恩圖表示:數學
SELECT * FROM TableA CROSS JOIN TableB
這個把「全部」聯接到「全部」,產生4乘4=16行,遠多於原始的集合。若是你學過數學,你便知道爲何這個聯合趕上大型的表很危險。
【2013-06-17 更新】下圖由 Moffatt 在 2008 年製做(點擊可查看大圖)。PS:Jeff Atwood 的文章寫於 2007 年。
it