我們先來定義一下。RIGHT JOIN 就是一種 join,會把 右邊的表格 所有資料都抓出來(所以才叫「右」),左邊的表格只會抓到有對應的資料。如果右邊的表格有資料但左邊沒有對應,左邊的欄位就會是 NULL。
你應該已經知道 LEFT JOIN 了,這其實差不多,只是「鏡像」一下。主要差別就是你把哪個表格當主角:左邊還是右邊。
RIGHT JOIN 的語法
RIGHT JOIN 的語法基本上跟 LEFT JOIN 一模一樣。結構長這樣:
SELECT
欄位們
FROM
左表 RIGHT JOIN 右表
ON
join_條件;
注意一下表格的順序:
- 左邊的表格 要寫在
RIGHT JOIN前面; - 右邊的表格 要寫在
RIGHT JOIN後面。
假設我們有兩個表格:
students — 學生清單:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Maria |
| 3 | Alex |
enrollments — 學生選課紀錄:
| enrollment_id | course_name | student_id |
|---|---|---|
| 101 | 數學 | 1 |
| 102 | 資訊學 | 2 |
| 103 | 生物學 | NULL |
現在我們想要拿到所有選課紀錄,還有學生的資訊(如果有的話)。如果找不到學生,學生那邊就會顯示 NULL。
用 RIGHT JOIN 的查詢會長這樣:
SELECT
enrollments.enrollment_id,
enrollments.course_name,
students.name AS student_name
FROM
students RIGHT JOIN enrollments
ON
students.student_id = enrollments.student_id;
結果:
| enrollment_id | course_name | student_name |
|---|---|---|
| 101 | 數學 | Otto |
| 102 | 資訊學 | Maria |
| 103 | 生物學 | NULL |
你可以看到,enrollments(右表)所有資料都出現在結果裡,就算 students(左表)沒對應也沒差。
RIGHT JOIN 跟 LEFT JOIN 的比較
如果你已經懂 LEFT JOIN,你可能會想:「那我幹嘛還要 RIGHT JOIN?直接用 LEFT JOIN 不就好了?」這問題問得好!我們來看一下差別,還有什麼時候該用 RIGHT JOIN。
資料方向
LEFT JOIN:會把 左表 所有資料都抓出來,不管右表有沒有對應。RIGHT JOIN:會把 右表 所有資料都抓出來,就算左表沒對應也沒差。
主表選擇 通常你會根據哪個表比較重要,或是寫查詢的順序,來決定用
LEFT還是RIGHT。等價性 任何
RIGHT JOIN都可以改寫成LEFT JOIN,只要把表格順序換一下。例如:-- RIGHT JOIN SELECT * FROM students RIGHT JOIN enrollments ON students.student_id = enrollments.student_id; -- 等價的 LEFT JOIN SELECT * FROM enrollments LEFT JOIN students ON students.student_id = enrollments.student_id;
所以啦,如果你不愛 RIGHT JOIN,其實可以完全不用它!
什麼時候該用 RIGHT JOIN?
實務上 RIGHT JOIN 其實沒那麼常見,大部分人都用 LEFT JOIN。但有些情境它還是很方便:
- 如果右表比較重要(比如它才是你的主表);
- 你想讓查詢的順序比較直覺,右表就是要寫在後面;
- 你在維護別人寫的 code,而他們都用
RIGHT JOIN。
RIGHT JOIN 的視覺化
為了更好理解 RIGHT JOIN,來看個圖:
左表 右表
[ A ] --------> [ 1 ]
[ B ] --------> [ 2 ]
[ C ] --------> [ 3 ]
[ D ] [ 4 ]
用 RIGHT JOIN 的時候,右表所有資料都會出現在結果裡,左表沒對應的地方就會是 NULL。
實戰練習
來測試一下你學會了沒。這題:
你有兩個表格 departments(部門)跟 employees(員工):departments:
| department_id | department_name |
|---|---|
| 1 | IT |
| 2 | 銷售部 |
| 3 | 會計部 |
employees:
| employee_id | name | department_id |
|---|---|---|
| 101 | Peter | 1 |
| 102 | Eva | 2 |
| 103 | Ron | NULL |
請寫一個 RIGHT JOIN 查詢,把所有部門都列出來,還有員工(如果有的話),沒有員工就顯示 NULL。
先自己試試看再看答案喔!
解答
查詢會長這樣:
SELECT
departments.department_name,
employees.name AS employee_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
結果會是:
| department_name | employee_name |
|---|---|
| IT | Peter |
| 銷售部 | Eva |
| 會計部 | NULL |
用 RIGHT JOIN 常見的錯誤
剛開始玩 RIGHT JOIN 很容易遇到這些問題:
- 忘記寫 join 條件
ON。沒寫條件你會拿到笛卡兒積,結果會亂七八糟。 - 搞混
RIGHT JOIN跟LEFT JOIN。表格順序寫錯,結果就會怪怪的。 - 沒處理
NULL值。用RIGHT JOIN很常會有NULL,你要會判斷或用COALESCE()處理。
就這樣啦!你現在會用 RIGHT JOIN 了,也知道它跟 LEFT JOIN 的差別,還能選對 join 的方式。下堂課我們會聊 FULL OUTER JOIN,到時候會把 全部全部 都 join 起來。祝你查詢順利!
GO TO FULL VERSION