CodeGym /課程 /SQL SELF /`RIGHT JOIN` 跟它的用法

`RIGHT JOIN` 跟它的用法

SQL SELF
等級 11, 課堂 3
開放

我們先來定義一下。RIGHT JOIN 就是一種 join,會把 右邊的表格 所有資料都抓出來(所以才叫「右」),左邊的表格只會抓到有對應的資料。如果右邊的表格有資料但左邊沒有對應,左邊的欄位就會是 NULL。

你應該已經知道 LEFT JOIN 了,這其實差不多,只是「鏡像」一下。主要差別就是你把哪個表格當主角:左邊還是右邊。

RIGHT JOIN 的語法

RIGHT JOIN 的語法基本上跟 LEFT JOIN 一模一樣。結構長這樣:

SELECT
    欄位們
FROM 
    左表 RIGHT JOIN 右表
ON 
    join_條件;

注意一下表格的順序:

  1. 左邊的表格 要寫在 RIGHT JOIN 前面;
  2. 右邊的表格 要寫在 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。

  1. 資料方向

    • LEFT JOIN:會把 左表 所有資料都抓出來,不管右表有沒有對應。
    • RIGHT JOIN:會把 右表 所有資料都抓出來,就算左表沒對應也沒差。
  2. 主表選擇 通常你會根據哪個表比較重要,或是寫查詢的順序,來決定用 LEFT 還是 RIGHT。

  3. 等價性 任何 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 很容易遇到這些問題:

  1. 忘記寫 join 條件 ON。沒寫條件你會拿到笛卡兒積,結果會亂七八糟。
  2. 搞混 RIGHT JOIN 跟 LEFT JOIN。表格順序寫錯,結果就會怪怪的。
  3. 沒處理 NULL 值。用 RIGHT JOIN 很常會有 NULL,你要會判斷或用 COALESCE() 處理。

就這樣啦!你現在會用 RIGHT JOIN 了,也知道它跟 LEFT JOIN 的差別,還能選對 join 的方式。下堂課我們會聊 FULL OUTER JOIN,到時候會把 全部全部 都 join 起來。祝你查詢順利!

2
任務
SQL SELF, 等級 11, 課堂 3
上鎖
簡單使用 `RIGHT JOIN`
簡單使用 `RIGHT JOIN`
2
任務
SQL SELF, 等級 11, 課堂 3
上鎖
使用 `RIGHT JOIN` 並加上過濾條件
使用 `RIGHT JOIN` 並加上過濾條件
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION