這篇文章是對SQL中JOIN語法的一個(gè)可視化解釋
我認(rèn)為Ligaya Turmelle的“post on SQL joins”一文是初學(xué)者很好的入門指南强品。由于SQL的JOINS語法是建立在集合論基礎(chǔ)之上,所以乍一看,使用韋恩圖(Venn diagrams)來解釋這種語法看似合情合理梯影。但是奏夫,就像她文章的評論者所說的那樣矮男,我在測試中發(fā)現(xiàn)韋恩圖并不能完與SQL JOINS語法一一對應(yīng)。盡管如此啄踊,但我依然喜歡這個(gè)觀點(diǎn),所以讓我們看看它是什么原理吧刁标。
假設(shè)我們有如下的數(shù)據(jù)表颠通。左邊是表A,右邊是表B膀懈,每個(gè)表中都插入了4條數(shù)據(jù)顿锰。
讓我們根據(jù)姓名將這些表用不同的方式連接(join)起來,看看是否能夠?qū)?yīng)于韋恩圖启搂。
Inner join(內(nèi)連接):結(jié)果集是A和B的交集
Full outer join(全外連接):結(jié)果集是A和B的并集
如果A硼控、B集合的數(shù)據(jù)不匹配,那么將缺失的那部分?jǐn)?shù)據(jù)置為null
Left outer join(左外連接):結(jié)果集是A的完全集和B中與A集匹配的那部分?jǐn)?shù)據(jù)的并集
B中與A集不匹配的那部分?jǐn)?shù)據(jù)置為null
為了得到只在A集中存在胳赌,B集中不存在的數(shù)據(jù)集牢撼,我們先使用Left outer join(左外連接),再通過where子句將在B集中顯示為null的數(shù)據(jù)排除
為了得到A疑苫、B集獨(dú)有(unique)數(shù)據(jù)的并集熏版,我們先使用full outer join(外連接),再通過where子句將兩個(gè)集合共有的數(shù)據(jù)排除
文章來源:A Visual Explanation of SQL Joins(需翻墻)
總結(jié):
在關(guān)系代數(shù)中捍掺,連接運(yùn)算是由一個(gè)笛卡爾積運(yùn)算和一個(gè)選取運(yùn)算構(gòu)成的撼短。首先用笛卡爾積完成對兩個(gè)數(shù)據(jù)集合的乘運(yùn)算,然后對生成的結(jié)果集合進(jìn)行選取運(yùn)算挺勿,確保只把分別來自兩個(gè)數(shù)據(jù)集合并且具有重疊部分的行合并在一起曲横。連接的全部意義在于在水平方向上合并兩個(gè)數(shù)據(jù)集合(通常是表),并產(chǎn)生一個(gè)新的結(jié)果集合满钟,其方法是將一個(gè)數(shù)據(jù)源中的行于另一個(gè)數(shù)據(jù)源中和它匹配的行組合成一個(gè)新元組胜榔。
SQL提供了多種類型的連接方式胳喷,它們之間的區(qū)別在于:從相互交疊的不同數(shù)據(jù)集合中選擇用于連接的行時(shí)所采用的方法不同