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 JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL 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.

JOIN là 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.

sql-joins

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 JOIN trực tiếp. Có thể mô phỏng bằng UNION giữa LEFT JOINRIGHT 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.