SQL的JOIN語法解析(inner join, left join, right join, full outer join的區別)
總的來說,四種JOIN的使用/區別可以描述為:
left join 會從左表(shop)那裏返回所有的記錄,即使在右表(sale_detail)中沒有匹配的行。
right outer join 右連接,返回右表中的所有記錄,即使在左表中沒有記錄與它匹配
full outer join 全連接,返回左右表中的所有記錄
在表中存在至少一個匹配時,inner join 返回行。 關鍵字inner可省略。
具體可以看stackoverflow上,Difference between Inner Join & Full join這個問題,說得蠻清楚的,我就搬運一下這個問題的答案好了。
Join
一共有三種OUTER
JOIN:
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
關鍵字OUTER
是可選擇的,取決於具體語言,在實現上它們都是遵循標準的,因此FULL JOIN
和FULL OUTER JOIN
是一樣的。
接著將以簡化的數據集來說明這些JOIN語句。考慮有如下兩個數據集,註意到有些元素在A中有,在B中沒有,反過來也是。
- Set "A" Set "B"
- AA BB
- -------- --------
- Item 1 Item 3
- Item 2 Item 4
- Item 3 Item 5
- Item 4 Item 6
LEFT OUTER JOIN
現在執行如下SQL語句(左連接,LEFT OUTER JOIN):
- SELECT * FROM A LEFT OUTER JOIN B ON AA = BB
將會得到如下的結果(空白的元素表示NULL
):
- AA BB
- -------- --------
- Item 1
- Item 2
- Item 3 Item 3
- Item 4 Item 4
左連接(LEFT OUTER JOIN)會輸出左邊的表中的所有結果,如果右邊的表中有相應項,則會輸出,否則為NULL
因此,如果要找出在AA(左邊的表)中有,而在BB(右邊的表)中沒有的數據項,可以使用如下的SQL語句:
- SELECT * FROM A LEFT OUTER JOIN B ON AA = BB
- WHERE BB is NULL
RIGHT OUTER JOIN
如果使用右連接,結果將會輸出BB中所有的數據項和AA中相應的匹配項(註意你現在是獲取了右邊的表中的所有數據項):
- SELECT * FROM A RIGHT OUTER JOIN B ON AA = BB
- AA BB
- -------- --------
- Item 3 Item 3
- Item 4 Item 4
- Item 5
- Item 6
FULL OUTER JOIN
如果想要取得所有的元素項,則可以使用FULL JOIN
:
- SELECT * FROM A FULL JOIN B ON AA = BB
- AA BB
- -------- --------
- Item 1 <-----+
- Item 2 |
- Item 3 Item 3 |
- Item 4 Item 4 |
- Item 5 +--- empty holes are NULL‘s
- Item 6 |
- ^ |
- | |
- +---------------------+
再次註意,缺失的數據項的值是NULL
。
INNER JOIN
INNER JOIN
跟JOIN
是一樣的,一般INNER
關鍵字可以省略。INNER JOIN
將只會返回相匹配的元素項,即不會返回結果為NULL
的數據項。
- SELECT * FROM A INNER JOIN B ON AA = BB
- AA BB
- -------- --------
- Item 3 Item 3
- Item 4 Item 4
CROSS JOIN
最後還有一個CROSS JOIN
,笛卡兒積,將會返回A中每個元素分別匹配B中所有元素的結果,即N*M組合。
- SELECT * FROM A CROSS JOIN B
- AA BB
- -------- --------
- Item 1 Item 3 ^
- Item 1 Item 4 +--- A中第一個元素, 匹配B中所有元素
- Item 1 Item 5 |
- Item 1 Item 6 v
- Item 2 Item 3 ^
- Item 2 Item 4 +--- A中第二個元素, 匹配B中所有元素
- Item 2 Item 5 |
- Item 2 Item 6 v
- Item 3 Item 3 ... and so on
- Item 3 Item 4
- Item 3 Item 5
- Item 3 Item 6
- Item 4 Item 3
- Item 4 Item 4
- Item 4 Item 5
- Item 4 Item 6
圖解SQL的JOIN操作
這邊也有一張圖清楚的說明了每個JOIN操作。建議把上面的內容瀏覽一邊後,再好好看下這張圖片,相信對JOIN的操作應該就完全明白了。
SQL的JOIN語法解析(inner join, left join, right join, full outer join的區別)