Khi làm việc với nhiều bảng dữ liệu có mối quan hệ với nhau, việc kết hợp (JOIN) giúp chúng ta phân tích thông tin hiệu quả hơn. Trước đó, bạn đã học về INNER JOIN
(lấy phần giao) và LEFT JOIN
(giữ lại toàn bộ bảng bên trái). Tuy nhiên, sẽ có lúc bạn cần giữ lại toàn bộ bên phải – đó là lúc chúng ta dùng RIGHT JOIN
. Còn nếu muốn lấy cả hai bên, dù có khớp hay không, bạn sẽ cần đến FULL OUTER JOIN
.
Trong bài này, chúng ta sẽ cùng nhau phân biệt rõ hai loại JOIN này, biết cách dùng chúng trong thực tế, và giải thích vì sao đôi khi một kết quả có NULL cũng rất quan trọng.
RIGHT JOIN là gì?
RIGHT JOIN là phép kết hợp dữ liệu trong đó:
- Trả về toàn bộ các dòng của bảng bên phải.
- Nếu có dòng tương ứng ở bảng bên trái, dữ liệu sẽ được kết hợp.
- Nếu không có dòng tương ứng, dữ liệu từ bảng bên trái sẽ là
NULL
.
Cú pháp:
SELECT *
FROM bảng_trái
RIGHT JOIN bảng_phải
ON bảng_trái.khoá = bảng_phải.khoá;
Ví dụ:
Giả sử bạn có hai bảng:
Lớp
id_lop | ten_lop |
---|---|
1 | Lớp 10A |
2 | Lớp 10B |
Học sinh
id_hs | ten_hs | id_lop |
---|---|---|
1 | An | 1 |
2 | Bình | NULL |
SELECT hs.ten_hs, l.ten_lop
FROM hoc_sinh hs
RIGHT JOIN lop l ON hs.id_lop = l.id_lop;
Kết quả:
ten_hs | ten_lop |
---|---|
An | Lớp 10A |
NULL | Lớp 10B |
→ Lớp 10B
không có học sinh, nhưng vẫn được hiện lên vì RIGHT JOIN
giữ nguyên bảng phải (lop
).
FULL OUTER JOIN là gì?
FULL OUTER JOIN sẽ kết hợp cả LEFT JOIN và RIGHT JOIN. Nó:
- Trả về tất cả các dòng từ hai bảng.
- Nếu không có khớp, phần không khớp sẽ là
NULL
.
Cú pháp:
Không phải mọi hệ quản trị CSDL đều hỗ trợ FULL OUTER JOIN
trực tiếp (ví dụ: MySQL không hỗ trợ thẳng). Tuy nhiên, bạn có thể mô phỏng nó bằng UNION
:
SELECT *
FROM bảng_trái
LEFT JOIN bảng_phải ON điều_kiện
UNION
SELECT *
FROM bảng_trái
RIGHT JOIN bảng_phải ON điều_kiện;
Khi nào dùng RIGHT JOIN và FULL OUTER JOIN?
JOIN loại gì | Khi nào nên dùng |
---|---|
RIGHT JOIN | Khi bạn muốn giữ tất cả dữ liệu của bảng bên phải, kể cả khi không có đối tượng liên kết từ bảng bên trái |
FULL OUTER JOIN | Khi bạn cần phân tích dữ liệu đầy đủ cả hai phía, kể cả các phần không khớp |
Một vài ví dụ tình huống thực tế:
- RIGHT JOIN: Liệt kê tất cả các lớp học, kể cả lớp chưa có học sinh.
- FULL OUTER JOIN: Tổng hợp tất cả các sản phẩm và đơn hàng, kể cả sản phẩm chưa bán hoặc đơn hàng thiếu thông tin sản phẩm.
Lưu ý kỹ thuật
FULL OUTER JOIN
không có sẵn trong MySQL → bạn phải dùngUNION
giữaLEFT JOIN
vàRIGHT JOIN
.- Cần sử dụng
COALESCE()
để xử lý giá trịNULL
hợp lý khi hiển thị dữ liệu kết hợp.
Tổng kết
RIGHT JOIN
giữ lại tất cả dữ liệu của bảng bên phải.FULL OUTER JOIN
kết hợp toàn bộ dữ liệu từ cả hai bảng, bất kể có khớp hay không.- Hiểu rõ khi nào cần phân tích toàn bộ dữ liệu giúp bạn dùng JOIN đúng lúc và tiết kiệm tài nguyên hệ thống.
Thảo luận