Bắt đầu bằng định nghĩa nha. RIGHT JOIN là một kiểu kết hợp trả về tất cả các dòng từ bảng bên phải (vì vậy mới gọi là "phải"), còn bảng bên trái thì chỉ trả về các dòng khớp thôi. Nếu bên trái không có dữ liệu tương ứng với dòng bên phải thì các cột của bảng bên trái sẽ là NULL.
Bạn đã quen với LEFT JOIN rồi đúng không, nó gần giống vậy nhưng kiểu "soi gương" thôi. Khác biệt chính là bảng nào được coi là chính: bên trái hay bên phải.
Cú pháp RIGHT JOIN
Cú pháp của RIGHT JOIN gần như giống hệt LEFT JOIN. Đây là cấu trúc của nó:
SELECT
các_cột
FROM
bang_trai RIGHT JOIN bang_phai
ON
dieu_kien_ket_hop;
Lưu ý thứ tự các bảng nha:
- bảng bên trái viết trước
RIGHT JOIN; - bảng bên phải viết sau từ
RIGHT JOIN.
Giả sử mình có hai bảng như sau:
students — danh sách sinh viên:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Maria |
| 3 | Alex |
enrollments — ghi nhận việc đăng ký khóa học của sinh viên:
| enrollment_id | course_name | student_id |
|---|---|---|
| 101 | Toán học | 1 |
| 102 | Tin học | 2 |
| 103 | Sinh học | NULL |
Bây giờ mình muốn lấy danh sách tất cả các bản ghi đăng ký, kèm thông tin sinh viên nếu có. Nếu không tìm thấy sinh viên thì sẽ thấy NULL thay cho thông tin sinh viên.
Câu truy vấn dùng RIGHT JOIN sẽ như sau:
SELECT
enrollments.enrollment_id,
enrollments.course_name,
students.name AS student_name
FROM
students RIGHT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Kết quả:
| enrollment_id | course_name | student_name |
|---|---|---|
| 101 | Toán học | Otto |
| 102 | Tin học | Maria |
| 103 | Sinh học | NULL |
Ở đây bạn thấy tất cả các bản ghi từ bảng enrollments (bảng phải) đều có trong kết quả, kể cả khi không có dòng nào khớp ở bảng students (bảng trái).
So sánh RIGHT JOIN và LEFT JOIN
Nếu bạn đã hiểu LEFT JOIN hoạt động thế nào, chắc bạn sẽ nghĩ: "Ủa, vậy cần gì RIGHT JOIN? Sao không dùng LEFT JOIN luôn?" Câu hỏi hay đó! Cùng phân tích sự khác biệt và khi nào nên chọn RIGHT JOIN nha.
Hướng dữ liệu
LEFT JOIN: trả về tất cả dòng từ bảng trái, bất kể có khớp ở bảng phải không.RIGHT JOIN: trả về tất cả dòng từ bảng phải, kể cả khi không có dòng khớp ở bảng trái.
Chọn bảng chính Thường bạn chọn
LEFThayRIGHTtùy vào bảng nào quan trọng hơn với bạn và thứ tự viết truy vấn cho tiện.Tương đương Bất kỳ
RIGHT JOINnào cũng có thể viết lại thànhLEFT JOINbằng cách đổi thứ tự bảng. Ví dụ:-- RIGHT JOIN SELECT * FROM students RIGHT JOIN enrollments ON students.student_id = enrollments.student_id; -- LEFT JOIN tương đương SELECT * FROM enrollments LEFT JOIN students ON students.student_id = enrollments.student_id;
Vậy nên nếu bạn không thích RIGHT JOIN, hoàn toàn có thể né nó luôn!
Khi nào dùng RIGHT JOIN?
Thực tế thì RIGHT JOIN ít dùng hơn LEFT JOIN. Nhưng có những trường hợp nó lại tiện:
- Nếu bảng phải quan trọng hơn (ví dụ nó là bảng chính của bạn);
- Khi bạn muốn viết truy vấn theo thứ tự mà bảng phải hợp lý hơn sau bảng trái;
- Nếu bạn làm việc với code cũ vốn đã dùng
RIGHT JOINrồi.
Hình dung trực quan RIGHT JOIN
Để dễ hiểu hơn về RIGHT JOIN, cùng xem sơ đồ này nhé:
Bảng trái Bảng phải
[ A ] --------> [ 1 ]
[ B ] --------> [ 2 ]
[ C ] --------> [ 3 ]
[ D ] [ 4 ]
Khi dùng RIGHT JOIN bạn sẽ lấy tất cả giá trị từ bảng phải, kèm dữ liệu tương ứng từ bảng trái. Nếu bảng trái không có thì sẽ là NULL.
Bài tập thực hành
Giờ kiểm tra kiến thức của bạn nhé. Đây là đề bài:
Bạn có hai bảng departments (phòng ban) và employees (nhân viên): departments:
| department_id | department_name |
|---|---|
| 1 | IT |
| 2 | Bán hàng |
| 3 | Kế toán |
employees:
| employee_id | name | department_id |
|---|---|---|
| 101 | Peter | 1 |
| 102 | Eva | 2 |
| 103 | Ron | NULL |
Viết truy vấn dùng RIGHT JOIN để trả về danh sách tất cả phòng ban, kèm nhân viên nếu có, hoặc NULL nếu không có ai.
Thử tự giải trước khi xem đáp án nha.
Đáp án bài tập
Truy vấn sẽ như sau:
SELECT
departments.department_name,
employees.name AS employee_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
Kết quả sẽ là:
| department_name | employee_name |
|---|---|
| IT | Peter |
| Bán hàng | Eva |
| Kế toán | NULL |
Lỗi thường gặp khi dùng RIGHT JOIN
Khi làm việc với RIGHT JOIN, người mới hay gặp mấy lỗi này nè:
- Quên điều kiện kết hợp
ON. Không chỉ định điều kiện là bạn sẽ nhận được tích đề các bảng, dễ loạn lắm. - Nhầm lẫn giữa
RIGHT JOINvàLEFT JOIN. Nếu bạn để bảng sai thứ tự thì kết quả sẽ sai bét. - Không xử lý giá trị
NULL. Truy vấn vớiRIGHT JOINthường raNULL, bạn cần hiểu đúng hoặc thay thế bằngCOALESCE()cho hợp lý.
Vậy là xong! Giờ bạn đã biết cách dùng RIGHT JOIN, hiểu sự khác biệt giữa RIGHT JOIN và LEFT JOIN, cũng như chọn kiểu kết hợp phù hợp cho bài toán của mình. Ở bài giảng tiếp theo tụi mình sẽ nói kỹ hơn về FULL OUTER JOIN, nơi kết hợp tất-tần-tật từ cả hai bảng luôn. Chúc bạn truy vấn vui vẻ nha!
GO TO FULL VERSION