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