Giải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)

SQL joins explained with examples: inner, left, right, full, cross and self joins
  1. Trang chủ
  2. Blog
  3. Cơ sở dữ liệu & SQL

Cơ sở dữ liệu & SQL

Giải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)

Học INNER, LEFT, RIGHT, FULL, CROSS và SELF JOIN với hai bảng nhỏ, truy vấn rõ ràng và kết quả chính xác.

Tác giả: Stack QuoraCập nhật 29/10/2026Đọc 8 phút
SQLGiải thích SQL JOINkèm ví dụstackquora.com

Điểm chính

  • INNER JOIN: chỉ các dòng khớp ở cả hai bảng.
  • LEFT JOIN: mọi dòng bên trái, kèm dòng khớp (NULL nếu không có).
  • RIGHT JOIN: mọi dòng bên phải, kèm dòng khớp.
  • FULL JOIN: mọi dòng của cả hai bảng, ghép khi có thể.
  • Join theo khóa, dùng bí danh bảng và đánh chỉ mục cột join.

Cơ sở dữ liệu thực tế không lưu mọi thứ trong một bảng. Khách hàng nằm ở một bảng, đơn hàng ở bảng khác. Để trả lời “khách hàng nào đã đặt hàng tháng này?”, bạn phải kết hợp chúng, và đó là việc của SQL JOIN.

Hướng dẫn này thiên về thực hành. JOIN khiến người mới bối rối vì cùng hai bảng cho kết quả khác nhau tùy loại join. Với dữ liệu nhỏ và cụ thể, mọi thứ trở nên dễ hiểu.

Giải thích SQL JOIN: bảng mẫu

customers

id name
1 Asha
2 Ben
3 Chitra

orders

id customer_id total
101 1 250
102 1 120
103 2 90
104 9 40

Chitra không có đơn hàng, và đơn 104 trỏ tới một khách hàng (9) không tồn tại. Hai trường hợp biên này cho thấy sự khác biệt giữa các loại join.

INNER JOIN

INNER JOIN chỉ trả về các dòng mà điều kiện đúng ở cả hai bảng. Dòng không có cặp sẽ bị loại.

SELECT c.name, o.id AS order_id, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;

Kết quả: Asha (101), Asha (102), Ben (103). Chitra và đơn 104 không có mặt. Dùng khi bạn chỉ quan tâm dữ liệu liên quan, như đơn hàng kèm thông tin khách. Viết JOIN trơn nghĩa là INNER JOIN.

LEFT JOIN

LEFT JOIN giữ mọi dòng của bảng bên trái và thêm các dòng khớp từ bên phải. Nếu không khớp, các cột bên phải là NULL.

SELECT c.name, o.id AS order_id, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

Kết quả: Asha (101), Asha (102), Ben (103), Chitra (NULL, NULL). Giờ Chitra đã xuất hiện.

Mẹo nhanh: để tìm khách chưa từng đặt hàng, lọc NULL ở bên phải: WHERE o.id IS NULL trả về Chitra. Người kiểm thử dùng cách này để tìm bản ghi mồ côi hoặc bị thiếu.

RIGHT JOIN và FULL JOIN

RIGHT JOIN là bản đối xứng của LEFT JOIN và giữ mọi dòng của bảng bên phải. Phần lớn mọi người đổi thứ tự bảng và dùng LEFT JOIN vì dễ đọc hơn.

SELECT c.name, o.id AS order_id
FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;

Kết quả gồm đơn 104 với tên khách là NULL. FULL (OUTER) JOIN trả về mọi dòng của cả hai bảng: Chitra không có đơn và đơn 104 không có khách.

SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id;

PostgreSQL và SQL Server hỗ trợ. MySQL thì không; hãy kết hợp LEFT JOIN và RIGHT JOIN bằng UNION. Để tìm hiểu thêm, tài liệu PostgreSQL có một hướng dẫn về join rõ ràng.

Join Chỉ dòng bên trái Chỉ dòng bên phải Dòng khớp
INNER Không Không Có
LEFT Có Không Có
RIGHT Không Có Có
FULL Có Có Có

CROSS JOIN và SELF JOIN

CROSS JOIN ghép mỗi dòng của bảng này với mỗi dòng của bảng kia: ba khách hàng và bốn đơn hàng cho mười hai dòng. Ít dùng, nhưng hữu ích để tạo tổ hợp, như dữ liệu kiểm thử cho mọi kích cỡ và màu sắc.

SELECT c.name, o.id
FROM customers c
CROSS JOIN orders o;

SELF JOIN nối một bảng với chính nó bằng bí danh, ví dụ để tìm quản lý của từng nhân viên.

SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

SQL JOIN: lỗi thường gặp và mẹo hiệu năng

  • Quên mệnh đề ON vô tình tạo CROSS JOIN và làm số dòng bùng nổ.
  • Lọc bảng bên phải trong WHERE sau LEFT JOIN biến nó thành INNER JOIN; hãy đặt điều kiện trong ON.
  • Tên cột mơ hồ: thêm bí danh bảng trước tên cột.
  • Join trên cột không duy nhất nhân đôi dòng và làm phình tổng.
  • Đánh chỉ mục các cột join, chỉ chọn cột cần thiết và kiểm tra truy vấn chậm bằng EXPLAIN.

Vì sao JOIN quan trọng với người kiểm thử

Kỹ sư QA dùng join để xác minh dữ liệu tạo qua giao diện hoặc API đã vào cơ sở dữ liệu đúng, và để tìm bản ghi mồ côi. Hãy đọc cùng hướng dẫn kiểm thử API với Postman (tiếng Anh). Kiến thức nền xem hướng dẫn SQL cho người mới (tiếng Anh), còn kho dữ liệu mới xem cơ sở dữ liệu vector (tiếng Anh). Để chạy cơ sở dữ liệu cục bộ, xem hướng dẫn Docker (tiếng Anh).

Lời kết

SQL JOIN trong một dòng: INNER chỉ giữ phần khớp, LEFT giữ mọi thứ bên trái, RIGHT mọi thứ bên phải, còn FULL giữ tất cả. Hãy luyện với hai bảng nhỏ đến khi đoán được kết quả trước khi chạy truy vấn; sau đó join ba bảng và kết hợp join với GROUP BY.

Câu hỏi thường gặp

INNER JOIN và LEFT JOIN khác nhau thế nào?

INNER JOIN chỉ trả về các dòng khớp ở cả hai bảng. LEFT JOIN trả về mọi dòng của bảng trái và điền NULL vào các cột bên phải không khớp.

SQL JOIN nào nhanh nhất?

Không loại nào luôn nhanh nhất. Hiệu năng phụ thuộc vào chỉ mục, kích thước bảng và kế hoạch thực thi. Hãy đánh chỉ mục cột join và kiểm tra kế hoạch.

MySQL có hỗ trợ FULL OUTER JOIN không?

Không. Trong MySQL, hãy kết hợp LEFT JOIN và RIGHT JOIN bằng UNION để có cùng kết quả.

SELF JOIN dùng để làm gì?

SELF JOIN so sánh các dòng trong cùng một bảng, như tìm quản lý của từng nhân viên trong một bảng employees duy nhất.

Vì sao join của tôi trả về dòng trùng lặp?

Dòng trùng xuất hiện khi cột join không duy nhất ở một trong hai bảng. Hãy kiểm tra khóa hoặc tổng hợp dữ liệu trước khi join.

Tiếp tục học (bài viết tiếng Anh)

Làm việc với Stack Quora

Cần hỗ trợ về kiểm thử, WordPress hoặc SEO?

Chúng tôi giúp các đội phát hành phần mềm tốt hơn và phát triển website. Hãy cho chúng tôi biết bạn đang làm gì, chúng tôi sẽ đề xuất bước tiếp theo.

Tiếp tục đọc

Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại

Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.