我認為ligaya turmelle的關于sql聯合(join)語句的文章對于新開發者來說是份很好的材料。sql 聯合語句好像是基于集合的,用韋恩圖來解釋咋一看是很自然而然的。不過正如在她的文章的回複中所說的,在測試中我發現韋恩圖并不是十分的比對sql聯合文法。
不過我還是喜歡這個觀點,是以我們來看看能不能用上韋恩圖。假設我們有下面兩張表。表a在左邊,表b在右邊。我們給它們各四條記錄。
我們用過name字段用幾種不同方式把這些表聯合起來,看能否得到和那些漂亮的韋恩圖在概念上的比對。
<a target="_blank"></a>
内聯合(inner join)隻生成同時比對表a和表b的記錄集。(如下圖)

inner join
全外聯合(full outer join)生成表a和表b裡的記錄全集,包括兩邊都比對的記錄。如果有一邊沒有比對的,缺失的這一邊為null。(如下圖)
full outer join
左外聯合(left outer join)生成表a的所有記錄,包括在表b裡比對的記錄。如果沒有比對的,右邊将是null。(如下圖)
left outer join
為了生成隻在表a裡而不在表b裡的記錄集,我們用同樣的左外聯合,然後用where語句排除我們不想要的記錄。(如下圖)
where tableb.id is nul
為了生成對于表a和表b唯一的記錄集,我們用同樣的全外聯合,然後用where語句排除兩邊都不想要的記錄。(如下圖)
where tablea.id is null
還有一種笛卡爾積或者交叉聯合(cross join),據我所知不能用韋恩圖表示:
這個把“所有”聯接到“所有”,産生4乘4=16行,遠多于原始的集合。如果你學過數學,你便知道為什麼這個聯合遇上大型的表很危險。
<b> 原文釋出時間為:2013-06-02</b>
<b>本文來自雲栖社群合作夥伴“linux中國”</b>