在SQL的進階查詢中,最常分不清的就是left join、right join以及inner join的差別。

這篇文章將帶到這三者的運作過程跟差異,那我們就開始吧!
假設我們有這兩張表:

(一)先備知識
要更輕鬆的了解join,必須先了解集合的交集跟差集的概念
假設今天有兩個集合:
A與B,兩個集合有一部分的重合:

那A與B的交集就會是以下的區塊:

所以就是 A && B的地方
例如:
A = {1,3,5,7,9}
B = {1,5,9,12,13}
那 A 與 B的交集就會是 : {1,5,9}
而差集的話則是 A – (A 與 B的交集)
會如下圖一樣:

(二)left join
left join 的語句為:
SELECT u.username,d.name FROM users u LEFT JOIN department d ON u.department_id=d.id;
這時候將users作為左表,department視為右表,
就可以畫成像這樣的文氏圖:

而left join是以左表為主,去查詢兩表之間相同條件的資料,
而on則是相同的條件,這裡是users.department_id=department.id,
所以會用A再加上找到的資料,
可以畫成以下的文式圖:

也就是說:
以左表為主表,去加入右表中相同條件的資料
所以查詢出來的結果會是:

(三) right join
left join 以左表為主,right join 則以右表為主,
right join 的語法為:
SELECT u.username,d.name FROM users u RIGHT JOIN department d ON u.department_id=d.id;
right join 是:
以右表的資料為主,加入左表有相同條件的資料
所以上述語法的right join 可以畫成以下的文氏圖:

而因為比較習慣靠左為主要欄位,所以right join 通常會寫成:
SELECT d.name,u.username FROM users u RIGHT JOIN department d ON u.department_id=d.id;
而查詢結果就會像下圖:

(四)inner join
inner join 在 MySQL語法中直接寫成join,語法如下:
SELECT u.username,d.name FROM users u join department d ON u.department_id=d.id;
而inner join 的話就是:
不以兩張表其一為主表,取出在相同條件下交集的資料
而畫成文氏圖的話就像這樣:

而為了讓結果更明顯,這次我們再加入一些資料:


而因為是inner join ,也就是兩者的交集,
所以14~16 的users以及6~7的資料都會被拋棄,
所以查詢結果會像下圖一樣:

(五) 互相轉換
在上方的段落提到:
left join 是以左表為主
right join 是以右表為主
inner join 不以兩表其一為主,只取交集
所以left join 如果要轉換為right join 語句,只需將兩表調換即可,例如:
SELECT u.username,d.name FROM users u LEFT JOIN department d ON u.department_id=d.id;
就可以直接轉換為:
SELECT u.username,d.name FROM department d RIGHT JOIN users u ON d.id=u.department_id;
兩者的文式圖變化就像下圖:

當然從right join到left join 也只需調換兩表順序即可,
不過inner join 就無法轉換成right join 或是left join(因為只有交集)。
===========================================================================
以上是關於left join 、 right join 以及 inner join 的講述,
其實三種join在面試中是最常被問到的,
而且通常是應用題或是白板題,
能回答出的話通常對於運作過程要有一定程度的熟悉
這篇文章的sql在這邊:
也可以下載下來匯入資料庫進行操作。