Chuyển đến nội dung chính

Giới thiệu về JOIN trong SQL

Trong hướng dẫn này, bạn sẽ tìm hiểu cơ chế hoạt động của JOIN trong SQL và các loại JOIN khác nhau.
Đã cập nhật 5 thg 6, 2026  · 9 phút đọc

Trong quá trình phân tích dữ liệu bằng SQL, bạn sẽ thường xuyên cần xem nhiều bảng và JOIN chúng để có được kết quả mong muốn. Việc JOIN bảng để phân tích dữ liệu cũng là kỹ năng bắt buộc đối với một nhà khoa học dữ liệu. Trong hướng dẫn này, bạn sẽ tìm hiểu về các loại JOIN khác nhau có thể thực hiện trong PostgreSQL. Trước tiên, bạn sẽ học các khái niệm cơ bản về JOIN trong SQL, sau đó tìm hiểu các loại JOIN và cú pháp của chúng trong PostgreSQL. Bạn sẽ kết thúc hướng dẫn này bằng cách thực thi nhiều loại truy vấn JOIN khác nhau sử dụng hai bảng. Để theo kịp, bạn nên quen thuộc với các kiến thức cơ bản về SQL và cách viết các truy vấn đơn giản trong PostgreSQL. Nếu bạn đang tìm tài liệu để học những nội dung này, các tài nguyên sau có thể hữu ích -

Hãy bắt đầu.

Tóm tắt nhanh (TL;DR)

  • JOIN trong SQL cho phép bạn kết hợp dữ liệu từ hai hoặc nhiều bảng bằng một cột chung.

  • INNER JOIN chỉ trả về các hàng khớp nhau, trong khi các biến thể của OUTER JOIN (LEFT, RIGHT, FULL) giữ lại các hàng không khớp từ một hoặc cả hai bên và điền chỗ trống bằng NULL.

  • CROSS JOIN tạo ra mọi tổ hợp có thể của các hàng (tích Descartes), và SELF JOIN cho phép JOIN một bảng với chính nó — hữu ích để so sánh các hàng trong cùng một tập dữ liệu.

  • Semi-join và anti-join, được viết dưới dạng các truy vấn con với IN hoặc NOT IN, lọc các hàng từ một bảng dựa trên việc chúng có thỏa điều kiện trong bảng khác hay không.

Thiết lập môi trường cơ sở dữ liệu trong PostgreSQL

Trước khi học các kiến thức cơ bản về JOIN trong SQL, sẽ là ý tưởng hay nếu bạn tạo một vài bảng để phân tích. Bạn sẽ cần ít nhất hai bảng có tối thiểu một cột chung. Mặc dù bạn có thể thực thi truy vấn self-join trên cùng một bảng, hãy tạm bỏ qua điều đó.

Bạn có thể thực hiện mọi thao tác SQL trên công cụ pgAdmin vốn thường đi kèm khi cài đặt PostgreSQL. Hãy mở pgAdmin và tạo một cơ sở dữ liệu (đặt tên tùy ý) để tạo bảng nếu bạn chưa có cơ sở dữ liệu hiện có. Sau đó, bạn có thể tạo hai bảng sau với các đặc tả như sau -

  • student_name (id, name)
  • student_stream (id, stream)

Lưu ý rằng cả hai bảng đều có cột id chung. Bạn có thể dùng các câu lệnh CREATE sau để tạo bảng -

  • Cho student_name -
    CREATE TABLE student_name
    (
    id smallint,
    name "char"[]
    );
    
  • Cho student_stream -
    CREATE TABLE student_stream
    (
    id smallint,
    stream "char"[]
    );
    

Giờ hãy chèn một vài bản ghi vào các bảng.

  • Cho student_name -
INSERT INTO student_name(id, name) VALUES (1, 'Sayak');

INSERT INTO student_name(id, name) VALUES (2, 'Alex');

INSERT INTO student_name(id, name) VALUES (3, 'Sameer');

INSERT INTO student_name(id, name) VALUES (4, 'Rick');
  • Cho student_stream -
INSERT INTO student_stream(id, stream) VALUES (1, 'CS');

INSERT INTO student_stream(id, stream) VALUES (1, 'IT');

INSERT INTO student_stream(id, stream) VALUES (2, 'ECE');

INSERT INTO student_stream(id, stream) VALUES (9, 'ECE');

Các bản ghi trong bảng sẽ như sau nếu bạn thực thi các truy vấn trên mà không thay đổi gì -

bảng student_name và student_stream

Bây giờ bạn đã có hai bảng đơn giản sẵn sàng. Hãy tiếp tục tìm hiểu các kiến thức cơ bản về JOIN trong SQL.

JOIN trong SQL - Cơ bản

JOIN trong SQL cho phép bạn tổng hợp hai hoặc nhiều (đôi khi chỉ một) bảng bằng các định danh chung. Lấy ví dụ hai bảng ở trên bạn đã tạo — cả hai bảng đều có cột id chung. Bạn có thể đặt câu hỏi về sự cần thiết của JOIN trong SQL. Hãy bàn ngắn gọn.

Do các ràng buộc về chuẩn hóa, bạn có thể không có đủ mọi thông tin cần thiết trong một bảng duy nhất. Chuẩn hóa không chỉ được khuyến khích mà còn cần thiết để duy trì tính nhất quán, giảm dư thừa và ngăn các bất thường khi chèn/cập nhật. Xét lại hai bảng trên. Giả sử bạn muốn tìm các chuyên ngành (stream) mà Sayak đã đăng ký. Để trả lời câu hỏi này, bạn sẽ cần JOIN hai bảng (cũng có thể dùng truy vấn con, nhưng tạm không xét) rồi tiếp tục xử lý.

Để JOIN hai bảng, phải có điểm chung giữa chúng. Điều này có nghĩa là cả hai bảng phải có ít nhất một cột trùng tên? Hay chính xác điều kiện là gì?

Các bảng bạn muốn JOIN không nhất thiết phải có cột trùng tên, nhưng về mặt logic chúng phải tương đồng, tức là kiểu dữ liệu phải giống nhau. Bạn không thể JOIN hai bảng có cột trùng tên nhưng khác kiểu dữ liệu. Giờ hãy tìm hiểu các loại JOIN khác nhau.

Các loại JOIN trong SQL

Trong phần này, bạn sẽ học một số loại JOIN trong SQL -

  • INNER JOIN
    • Self-join
  • OUTER JOIN
    • LEFT JOIN
    • RIGHT JOIN
    • FULL JOIN
  • CROSS JOIN
  • Semi-join và Anti-join

PostgreSQL cung cấp các từ khóa riêng cho các loại JOIN được viết hoa toàn bộ ở trên. Hãy lần lượt tìm hiểu từng loại. Trước hết, bạn sẽ xem trực quan các JOIN, sau đó thực thi các truy vấn JOIN tương ứng trong PostgreSQL.

INNER JOIN

Xem sơ đồ sau để hiểu trực quan về INNER JOIN -

Sơ đồ inner join

Trong ví dụ trên, cột được xét là cột id. INNER JOIN sẽ bỏ qua các cột còn lại nếu giá trị không chung ở cả hai bảng. Giờ hãy thực thi một truy vấn trong PostgreSQL để thực hiện INNER JOIN giữa hai bảng — student_name và student_stream.

Sau khi chạy truy vấn sau, bạn nhận được kết quả như trong hình trên -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
ON s1.id = s2.id;

s1s2 là bí danh của hai bảng. Bạn dùng từ khóa ON cùng với INNER JOIN. Truy vấn cũng có thể được thực thi với từ khóa USING -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
INNER JOIN student_stream AS s2
USING (id);

Self Join cho phép bạn JOIN chính một bảng. Nhưng khi nào đây là lựa chọn tốt? Giả sử bạn có một bảng gồm các cột sau -

  • Country
  • Continent

Giờ bạn muốn liệt kê hai quốc gia sao cho châu lục của chúng giống nhau. Hình sau sẽ giúp bạn hình dung kết quả mong muốn -

kết quả self join (dạng bảng)

OUTER JOIN

OUTER JOIN có thể được chia thành ba loại -

LEFT JOIN hay Left Outer JOIN: Sơ đồ sau cho bạn cái nhìn tổng quan về LEFT JOIN trong SQL -

Sơ đồ left join trong SQL

Lưu ý rằng không giống INNER JOIN, LEFT JOIN truy xuất cả các bản ghi từ bảng bên trái (theo thứ tự bạn chỉ định trong truy vấn) mà không có bản ghi khớp ở bảng bên phải. Điều này cho thấy SameerRick chưa đăng ký chuyên ngành nào. Truy vấn tương ứng sẽ là -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
LEFT JOIN student_stream AS s2
ON s1.id = s2.id;

RIGHT JOIN hay Right Outer JOIN: RIGHT JOIN chính là đối nghịch của LEFT JOIN -

sơ đồ right join trong SQL

RIGHT JOIN có thể giúp bạn tìm các chuyên ngành không có sinh viên nào đăng ký. Truy vấn cho trường hợp này là -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
RIGHT JOIN student_stream AS s2
ON s1.id = s2.id;

FULL JOIN hay Full Outer JOIN: FULL JOIN cho phép bạn kết hợp cả LEFT JOINRIGHT JOIN trong một phép tổng hợp -

Sơ đồ full join trong SQL

Truy vấn tương ứng sẽ là -

SELECT s1.id, s1.name, s2.stream
FROM student_name AS s1
FULL JOIN student_stream AS s2
ON s1.id = s2.id;

Lưu ý rằng bạn có thể thực thi tất cả các truy vấn OUTER JOIN trên bằng từ khóa USING. Giờ hãy học về CROSS JOIN.

CROSS JOIN

CROSS JOIN về bản chất là tích Descartes giữa hai tập hợp được biểu diễn bằng SQL. Giả sử bạn cần có mọi tổ hợp có thể giữa hai bảng hoặc thậm chí trong một bảng. Bạn sẽ cần CROSS JOIN để làm việc này. Hình sau minh họa trực quan khái niệm này -

Sơ đồ cross join

Bạn đã có hai bảng để thử. Để có tất cả tổ hợp có thể giữa các cột id của bảng student_namestudent_stream, bạn có thể chạy truy vấn sau -

SELECT s1.id, s2.id
FROM student_name AS s1
CROSS JOIN student_stream AS s2;

Và bạn sẽ nhận kết quả sau -

Bảng mọi tổ hợp có thể

Giờ hãy xem hai loại JOIN còn lại mà PostgreSQL không cung cấp từ khóa trực tiếp.

Semi-join và Anti-join

Hãy xét lại các bảng bạn đã tạo trước đó trong hướng dẫn:

Bảng gốc

Các truy vấn Semi Join thường được thực hiện dưới dạng truy vấn con nơi các hàng được chọn từ bảng thứ nhất theo một điều kiện (hoặc tập điều kiện) được khớp trong bảng thứ hai. Giả sử bảng bên trái là bảng thứ nhất và bảng bên phải là bảng thứ hai.

Các truy vấn Anti Join thì ngược lại. Trong Anti Join, các hàng được chọn từ bảng thứ nhất theo một điều kiện (hoặc tập điều kiện) không khớp trong bảng thứ hai. Dưới đây là sơ đồ giúp bạn hiểu trực quan -

Sơ đồ semi join và anti join

Truy vấn để hiện thực Semi Join sẽ là -

select id, name
from student_name
where id IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));

Tương tự, truy vấn hiện thực Anti Join trong trường hợp này sẽ là -

select id, name
from student_name
where id NOT IN
(select id from student_stream where stream
IN ('CS', 'IT', 'ECE'));

Lưu ý việc sử dụng NOT trong truy vấn trên.

Nâng kỹ năng JOIN trong SQL lên cấp độ tiếp theo

Đó là tất cả cho hướng dẫn này. Bạn đã học một loạt các loại JOIN trong SQL và làm quen với cú pháp của chúng trong PostgreSQL. Nếu bạn muốn luyện tập các bài tập JOIN SQL thách thức, bạn nên học khóa Joining Data in SQL của DataCamp. Thực tế, tài liệu từ khóa học đã được dùng làm tham khảo để biên soạn hướng dẫn này.

Hãy cho tôi biết câu hỏi của bạn trong phần Bình luận.

Chủ đề

Các khóa học về SQL

Courses

Xử lý dữ liệu trong SQL

4 giờ
323.6K
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow