Trong quá trình làm việc với cơ sở dữ liệu quan hệ (RDBMS), việc kết hợp dữ liệu từ nhiều bảng là điều không thể tránh khỏi. Đó là lúc bạn cần đến SQL JOIN.
Tuy nhiên, nếu không nắm rõ từng loại JOIN, bạn dễ gặp lỗi logic, thiếu dữ liệu hoặc kết quả không như mong muốn.
Trong bài viết này, chúng ta sẽ cùng khám phá 4 loại JOIN phổ biến nhất trong SQL:
INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOIN
Bằng cách sử dụng hình minh hoạ và ví dụ thực tế, bạn sẽ dễ dàng phân biệt chúng và biết khi nào nên dùng loại JOIN nào.
JOINlà câu lệnh dùng để kết hợp dữ liệu từ hai hoặc nhiều bảng dựa trên một điều kiện liên kết, thường là một khóa chung giữa các bảng.

1. Tình huống minh họa thực tế
Hãy tưởng tượng bạn đang quản lý một hệ thống bán hàng, với hai bảng dữ liệu:
Bảng customers – Danh sách khách hàng:
| customer_id | name |
|---|---|
| 1 | Lan |
| 2 | Hùng |
| 3 | Mai |
| 4 | An |
Bảng orders – Danh sách đơn hàng:
| order_id | customer_id | product |
|---|---|---|
| 101 | 1 | Laptop |
| 102 | 2 | iPhone |
| 103 | 1 | Bàn phím |
| 104 | 5 | Chuột |
INNER JOIN- Lấy những bản ghi khớp ở cả hai bảng
SELECT customers.name, orders.product
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;
Kết quả:
| name | product |
|---|---|
| Lan | Laptop |
| Lan | Bàn phím |
| Hùng | iPhone |
🔍 Chỉ lấy những đơn hàng có khách hàng tồn tại và ngược lại. Bỏ qua dữ liệu không khớp.
LEFT JOIN- Lấy toàn bộ dữ liệu từ bảng bên trái (customers)
SELECT customers.name, orders.product
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
Kết quả:
| name | product |
|---|---|
| Lan | Laptop |
| Lan | Bàn phím |
| Hùng | iPhone |
| Mai | NULL |
| An | NULL |
🔍 Hiển thị toàn bộ khách hàng, dù có đơn hàng hay không. Các dòng không có đơn hàng sẽ được điền NULL.
RIGHT JOIN- Lấy toàn bộ dữ liệu từ bảng bên phải (orders)
SELECT customers.name, orders.product
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
Kết quả:
| name | product |
|---|---|
| Lan | Laptop |
| Lan | Bàn phím |
| Hùng | iPhone |
| NULL | Chuột |
🔍 Hiển thị toàn bộ đơn hàng, dù có thông tin khách hàng hay không.
FULL OUTER JOIN- Kết hợp tất cả dữ liệu từ hai bảng
SELECT customers.name, orders.product
FROM customers
FULL OUTER JOIN orders ON customers.customer_id = orders.customer_id;
💡 Lưu ý: MySQL không hỗ trợ
FULL OUTER JOINtrực tiếp. Có thể mô phỏng bằngUNIONgiữaLEFT JOINvàRIGHT JOIN.
Kết quả:
| name | product |
|---|---|
| Lan | Laptop |
| Lan | Bàn phím |
| Hùng | iPhone |
| Mai | NULL |
| An | NULL |
| NULL | Chuột |
🔍 Hiển thị toàn bộ khách hàng và toàn bộ đơn hàng, dù có liên kết hay không.
So sánh nhanh các loại JOIN
JOIN |
Bảng A (customers) | bảng B (orders) | Khi không khớp | Dùng khi nào? |
|---|---|---|---|---|
INNER JOIN |
Có khớp | Có khớp | Bỏ qua | Chỉ cần dữ liệu có liên hệ từ cả hai bảng |
LEFT JOIN |
Tất cả | Có khớp | NULL bên phải | Giữ toàn bộ dữ liệu bảng chính (bảng A) |
RIGHT JOIN |
Có khớp | Tất cả | NULL bên trái | Giữ toàn bộ dữ liệu bảng phụ (bảng B) |
FULL OUTER JOIN |
Tất cả | Tất cả | NULL nếu không khớp | Tổng hợp đầy đủ dữ liệu từ cả hai bảng, kể cả không khớp |
2. Lời kết
Việc hiểu rõ từng loại JOIN không chỉ giúp bạn viết truy vấn chính xác hơn, mà còn giúp bạn xử lý dữ liệu hiệu quả, tránh mất thông tin quan trọng.