SQL筆記:SQL資料表之JOIN指令圖解介紹

SQL除了四大指令CRUD(Create, read, update and delete)之外,最讓初學者頭痛的就是JOIN了,兩張資料表的鍵值在那邊交集來聯集去的,頭昏眼花是常有的事,因此寫下這篇文章,利用圖型來簡單表達一下JOIN的概念。

假設有Table_A, Table_B這兩資料表,資料分別如下表所示:(打星號*表示資料是重疊的)

SELECT [iIndex], [cName] FROM [Table_A]
---------------------------------------
iIndex  cName
1       關羽*
2       張飛
3       趙雲*
4       魏延

SELECT [iIndex], [cName] FROM [Table_B]
---------------------------------------
iIndex  cName
1       劉備
2       關羽*
3       曹操
4       趙雲*

完整聯集:FULL OUTER JOIN

這個部份表示兩張資料表的全部資料都要了!請見下圖圖示:

使用指令與結果:
/*** JOIN TEST 01 ***/
SELECT *
FROM Table_A
FULL OUTER JOIN Table_B
ON Table_A.cName = Table_B.cName

完整交集:INNER JOIN

這個部份表示兩張資料表裡面,確定彼此都存在的資料我才要,其它各自只出現在自己的表中的資料全部都不要!請見下圖圖示:

使用指令與結果:
/*** JOIN TEST 02 ***/
SELECT *
FROM Table_A
INNER JOIN Table_B
ON Table_A.cName = Table_B.cName

部份聯集與完整交集:LEFT OUTER JOIN

這個部份表示在Table_A的資料我全要,但是在Table_B裡有出現在Table_A的資料我也要!請見下圖圖示:(註:相同需求但反過變成Table_B全要,那就是RIGHT OUTER JOIN)

使用指令與結果:
/*** JOIN TEST 03 ***/
SELECT *
FROM Table_A
LEFT OUTER JOIN Table_B
ON Table_A.cName = Table_B.cName

部份聯集:LEFT OUTER JOIN - Table_B IS NULL

這個部份表示在Table_A的資料我全要,但是在Table_B裡有出現在Table_A的資料在結果中剃除!請見下圖圖示:

使用指令與結果:
/*** JOIN TEST 04 ***/
SELECT *
FROM Table_A
LEFT OUTER JOIN Table_B
ON Table_A.cName = Table_B.cName
WHERE Table_B.iIndex IS NULL

部份聯集:FULL OUTER JOIN - Table_A OR Table_B IS NULL

這個部份表示在Table_A與Table_B的資料我全要,但是Table_A與Table_B中共同擁有的資料我不要!請見下圖圖示:

使用指令與結果:
/*** JOIN TEST 05 ***/
SELECT *
FROM Table_A
FULL OUTER JOIN Table_B
ON Table_A.cName = Table_B.cName
WHERE Table_A.iIndex IS NULL OR Table_B.iIndex IS NULL

以上大概就是JOIN所有可能用到的情況,當然如果你是要取Table_B那一邊的,請自己把FROM Table的前後對調一下就可以了,大家應該可以舉一反三才是。

CROSS JOIN

一般情況下幾乎用不到,這個效果稱為笛卡爾乘積,顯現的效果就是TableA X TableB的相乘結果集,以本文章中的例子來說,就是4 X 4 = 16種結果,以當前的資料型態來說,根本沒有意義。(可參考:Wiki 交叉連接

Union

一般情況下幾乎用不到,這個效果就是把兩個欄位型態均相同的表結合起來。例如公司X系統中有一個很複雜的資料庫,透過超多SQL指令後整理出一份珍貴的檢視表A;Y系統中也有一個很複雜的資料庫,透過完全不同的SQL指令後整理出一份珍貴的檢視表B,我們可以使用「檢視表A UNION 檢視表B」來進行異質資料結合,供給前端系統進行查詢。

SQL Command InnerJoin OuterJoin LeftOuterJoin FullOuterJoin