CodeGym /Các khóa học /SQL SELF /`RIGHT JOIN` và cách dùng nó

`RIGHT JOIN` và cách dùng nó

SQL SELF
Mức độ , Bài học
Có sẵn

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:

  1. bảng bên trái viết trước RIGHT JOIN;
  2. 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 JOINLEFT 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.

  1. 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.
  2. Chọn bảng chính Thường bạn chọn LEFT hay RIGHT tù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.

  3. Tương đương Bất kỳ RIGHT JOIN nào cũng có thể viết lại thành LEFT JOIN bằ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 JOIN rồ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è:

  1. 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.
  2. Nhầm lẫn giữa RIGHT JOINLEFT JOIN. Nếu bạn để bảng sai thứ tự thì kết quả sẽ sai bét.
  3. Không xử lý giá trị NULL. Truy vấn với RIGHT JOIN thường ra NULL, bạn cần hiểu đúng hoặc thay thế bằng COALESCE() 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 JOINLEFT 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!

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION