画图讲解SQL join 语句
我認(rèn)為 Ligaya Turmelle 的關(guān)于SQL聯(lián)合(join)語句的帖子對(duì)于新手開發(fā)者來說是份很好的材料。SQL 聯(lián)合語句好像是基于集合的,用韋恩圖來解釋咋一看是很自然而然的。不過正如在她的帖子的回復(fù)中所說的,在測(cè)試中我發(fā)現(xiàn)韋恩圖并不是十分的匹配SQL聯(lián)合語法。
不過我還是喜歡這個(gè)觀點(diǎn),所以我們來看看能不能用上韋恩圖。假設(shè)我們有下面兩張表。表A在左邊,表B在右邊。我們給它們各四條記錄。
id name id name -- ---- -- ---- 1 Pirate 1 Rutabaga 2 Monkey 2 Pirate 3 Ninja 3 Darth Vader 4 Spaghetti 4 Ninja我們用過name字段用幾種不同方式把這些表聯(lián)合起來,看能否得到和那些漂亮的韋恩圖在概念上的匹配。
內(nèi)聯(lián)合(inner join)
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.nameid name id name -- ---- -- ---- 1 Pirate 2 Pirate 3 Ninja 4 Ninja內(nèi)聯(lián)合(inner join)只生成同時(shí)匹配表A和表B的記錄集。(如下圖)
全外聯(lián)合(full outer join)
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.nameid 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全外聯(lián)合(full outer join)生成表A和表B里的記錄全集,包括兩邊都匹配的記錄。如果有一邊沒有匹配的,缺失的這一邊為null。(如下圖)
左外聯(lián)合(left outer join)
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.nameid name id name -- ---- -- ---- 1 Pirate 2 Pirate 2 Monkey null null 3 Ninja 4 Ninja 4 Spaghetti null null左外聯(lián)合(left outer join)生成表A的所有記錄,包括在表B里匹配的記錄。如果沒有匹配的,右邊將是null。(如下圖)
左外聯(lián)合,然后用where語句排除一邊我們不想要的記錄
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS nullid name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null為了生成只在表A里而不在表B里的記錄集,我們用同樣的左外聯(lián)合,然后用where語句排除我們不想要的記錄。(如下圖)
全外聯(lián)合,然后用where語句排除兩邊都不想要的記錄
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS nullid name id name -- ---- -- ---- 2 Monkey null null 4 Spaghetti null null null null 1 Rutabaga null null 3 Darth Vader為了生成對(duì)于表A和表B唯一的記錄集,我們用同樣的全外聯(lián)合,然后用where語句排除兩邊都不想要的記錄。(如下圖)
?
交叉聯(lián)合(cross join)
還有一種笛卡爾積或者交叉聯(lián)合(cross join),據(jù)我所知不能用韋恩圖表示:
SELECT * FROM TableA CROSS JOIN TableB這個(gè)把“所有”聯(lián)接到“所有”,產(chǎn)生4乘4=16行,遠(yuǎn)多于原始的集合。如果你學(xué)過數(shù)學(xué),你便知道為什么這個(gè)聯(lián)合遇上大型的表很危險(xiǎn)。?
總結(jié)圖
下圖由 Moffatt 在 2008 年制作(點(diǎn)擊可查看大圖)。PS:Jeff Atwood 的文章寫于 2007 年。
?
總結(jié)
以上是生活随笔為你收集整理的画图讲解SQL join 语句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏策划《永恒》
- 下一篇: 移动端实现hover效果