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

Toán tử tập hợp trong SQL: Hướng dẫn toàn diện

Làm chủ các toán tử tập hợp trong SQL: UNION, UNION ALL, INTERSECT và EXCEPT. Học quy tắc cú pháp, xem ví dụ thực tế và hiểu khi nào dùng từng toán tử.
Đã cập nhật 2 thg 6, 2026  · 11 phút đọc

Các phép toán trên tập hợp là nền tảng của SQL, cho phép chúng ta kết hợp, so sánh và lọc dữ liệu từ nhiều nguồn. Chúng không thể thiếu cho các tác vụ từ tích hợp và làm sạch dữ liệu đến phân tích nâng cao và lập báo cáo.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu toán tử tập hợp là gì, cách dùng trong SQL, các ứng dụng thực tế và nhiều hơn nữa! Nếu bạn đang tìm một tài nguyên học SQL đầy đủ, hãy xem lộ trình kỹ năng gồm bảy khóa học SQL Fundamentals.

Nếu bạn đang vội, hãy bắt đầu với câu trả lời rất ngắn gọn về các phép toán tập hợp trong SQL.

Các phép toán tập hợp trong SQL là gì?

Các phép toán tập hợp trong SQL là kỹ thuật để kết hợp hoặc so sánh kết quả của hai hay nhiều câu lệnh SELECT. Chúng hoạt động như các phép toán tập hợp trong toán học, cho phép chúng ta tìm hợp, giao hoặc hiệu giữa các hàng được trả về bởi truy vấn. Điều này khiến chúng trở nên không thể thiếu khi phân tích dữ liệu từ nhiều nguồn hoặc nhiều góc nhìn.

Dưới đây là tổng quan nhanh về các phép toán tập hợp cốt lõi:

  • UNION: Gộp tất cả các hàng duy nhất từ hai hoặc nhiều câu lệnh SELECT, loại bỏ trùng lặp.

  • UNION ALL: Gộp tất cả các hàng từ hai hoặc nhiều câu lệnh SELECT, giữ lại trùng lặp.

  • INTERSECT: Chỉ trả về các hàng xuất hiện trong cả hai câu lệnh SELECT.

  • EXCEPT: Trả về các hàng từ câu lệnh SELECT thứ nhất không xuất hiện trong câu lệnh thứ hai.

So sánh với các phép toán đại số quan hệ

Đại số quan hệ là một khung lý thuyết cung cấp nền tảng để hiểu các truy vấn cơ sở dữ liệu. Nó đưa ra các phép toán trừu tượng như chiếu, chọn và nối, bắt nguồn từ các nguyên lý toán học và độc lập với hệ thống cơ sở dữ liệu cụ thể. Hãy coi nó như logic “hậu trường” vận hành tương tác của chúng ta với cơ sở dữ liệu.

Các toán tử tập hợp trong SQL cung cấp cách triển khai thực tiễn các khái niệm này trong môi trường cơ sở dữ liệu. Chúng cho phép chúng ta thực hiện các phép hợp, giao và hiệu trực tiếp trên các tập kết quả của truy vấn SQL.

Trong khi đại số quan hệ cung cấp nền tảng hình thức cho các phép toán cơ sở dữ liệu, các toán tử tập hợp trong SQL mang đến một giao diện chuẩn hóa, thân thiện cho các nhiệm vụ thao tác dữ liệu.

Hiểu mối quan hệ giữa các toán tử tập hợp và các phép toán trong đại số quan hệ giúp soi sáng nền tảng lý thuyết của SQL. Biết được mối liên hệ này giúp bạn viết truy vấn với mô hình tinh thần rõ ràng về những gì diễn ra bên dưới.

Các loại toán tử tập hợp trong SQL

Có ba toán tử tập hợp chính trong SQL:

  • UNION

  • INTERSECT

  • EXCEPT (hoặc MINUS trong một số biến thể)

Các toán tử này tương ứng về mặt toán học với khái niệm hợp, giao và hiệu tập hợp.

Quy tắc sử dụng toán tử tập hợp

Trước khi kết hợp truy vấn bằng toán tử tập hợp, cần đáp ứng bốn yêu cầu. Chỉ cần sai một điều, truy vấn của bạn sẽ báo lỗi.

  • Cùng số lượng cột: Mỗi SELECT phải trả về cùng số cột. Nếu một truy vấn trả về ba cột và truy vấn khác trả về hai, cơ sở dữ liệu sẽ ném lỗi.

  • Kiểu dữ liệu tương thích: Các cột tương ứng phải có kiểu phù hợp. Bạn không thể kết hợp cột tên kiểu VARCHAR với cột ID kiểu INTEGER ở cùng vị trí.

  • Thứ tự cột giống nhau: SQL ánh xạ cột theo vị trí, không theo tên. Cột thứ nhất của truy vấn một ánh xạ tới cột thứ nhất của truy vấn hai, bất kể tên cột là gì.

  • ORDER BY chỉ ở cuối: ORDER BY phải xuất hiện một lần, ở cuối cùng của truy vấn kết hợp. Bạn không thể dùng nó bên trong từng câu lệnh SELECT riêng lẻ.

Một chi tiết nữa: tên cột trong kết quả đầu ra lấy từ câu lệnh SELECT đầu tiên. Bí danh ở các truy vấn sau sẽ bị bỏ qua, vì vậy nếu cần tên cột tùy chỉnh, hãy chỉ thêm bí danh vào truy vấn đầu tiên.

Cách dùng toán tử UNION trong SQL

Toán tử UNION kết hợp kết quả của hai hoặc nhiều truy vấn SELECT thành một tập kết quả duy nhất, mặc định loại bỏ các hàng trùng lặp.

Ví dụ, giả sử chúng ta có hai bảng, employeescontractors, mỗi bảng có các cột tương tự như contractors, departmentsalary. Vì mục đích học tập, hãy xem hai bảng giả lập này:

employees:

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

Carol

Engineering

80000

John

HR

55000

contractors:

name

department

salary

David

Marketing

60000

Eva

Sales

68000

Carol

Engineering

75000

Chúng ta có thể kết hợp kết quả từ cả hai bảng bằng lệnh sau:

-- Using UNION to combine all employees and contractors
SELECT name, department, salary FROM employees
UNION
SELECT name, department, salary FROM contractors;

Truy vấn này chọn các cột name, departmentsalary từ cả hai bảng employeescontractors rồi kết hợp chúng thành một tập kết quả duy nhất. Toán tử UNION tự động loại bỏ các hàng trùng lặp khỏi kết quả cuối.

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

Carol

Engineering

80000

John

HR

55000

David

Marketing

60000

Eva

Sales

68000

Lưu ý rằng Carol, người xuất hiện ở cả hai bảng, chỉ được liệt kê một lần trong kết quả. Nếu muốn giữ cả hai trường hợp của Carol (với mức lương khác nhau), chúng ta sẽ dùng UNION ALL.

UNION vs UNION ALL

Toán tử UNION không loại bỏ các giá trị NULL. Nếu một cột chứa giá trị NULL trong một tập kết quả và cột tương ứng trong tập kết quả khác chứa giá trị không-NULL, các giá trị NULL sẽ được giữ lại trong tập kết quả cuối cùng do UNION tạo ra.

Nếu chúng ta muốn bao gồm các giá trị NULL trong tập kết quả và ngăn việc chúng bị loại bởi UNION, có thể dùng toán tử UNION ALL. Toán tử này kết hợp kết quả của nhiều truy vấn SELECT, bao gồm tất cả các hàng từ mỗi tập kết quả, bất kể có trùng lặp hay chứa NULL.

Cách dùng toán tử INTERSECT trong SQL

Toán tử INTERSECT chỉ trả về các hàng xuất hiện trong cả hai tập kết quả. Hãy coi nó như việc tìm những người thuộc cả hai nhóm.

Hãy dùng INTERSECT để truy vấn các bảng trên. Vì mục đích ví dụ, ta chỉ truy vấn cột name và department:

-- Using INTERSECT to find common employees
SELECT name, department FROM employees
INTERSECT
SELECT name, department FROM contractors;

Truy vấn này chọn các cột namedepartment từ cả hai bảng employees và contractors và chỉ trả về những hàng tồn tại ở cả hai bảng dựa trên tất cả các cột được chọn.

name

department

Carol

Engineering

Toán tử INTERSECT xử lý các giá trị NULL theo các quy tắc so sánh chuẩn, coi các giá trị NULL là bằng nhau khi so sánh các cột tương ứng. Nó cũng cho kết quả rỗng khi làm việc với các tập kết quả rỗng.

Nói cách khác, nếu một giá trị NULL có trong một tập kết quả và cột tương ứng trong tập kết quả kia chứa giá trị không-NULL, các hàng sẽ không được coi là bằng nhau – chúng sẽ không nằm trong kết quả giao.

Ngoài ra, nếu một trong các tập kết quả đưa vào toán tử INTERSECT là rỗng, kết quả tổng thể cũng rỗng. Không có hàng chung nào giữa một tập rỗng và bất kỳ thứ gì khác.

Cách dùng toán tử UNION trong SQL

Toán tử EXCEPT trả về các hàng từ tập kết quả thứ nhất mà không có trong tập thứ hai.

Trong Oracle Database, EXCEPT được viết là MINUS; các biến thể lớn khác (PostgreSQL, SQL Server, MySQL 8.0.31+, SQLite) dùng EXCEPT.

Ví dụ, giả sử chúng ta chạy truy vấn sau:

-- Using EXCEPT to find employees who are not contractors
SELECT name, department, salary FROM employees
EXCEPT
SELECT name, department, salary FROM contractors;

Các cột name, departmentsalary được chọn từ bảng employees và chỉ trả về các hàng không tồn tại trong bảng contractors.

name

department

salary

Alice

Marketing

65000

Bob

Sales

70000

John

HR

55000

Toán tử EXCEPT cũng tuân theo các quy tắc so sánh chuẩn khi xử lý giá trị NULL. Hành vi của nó với các tập kết quả rỗng sẽ cho ra tập rỗng nếu tập thứ nhất rỗng, hoặc bao gồm toàn bộ hàng từ tập thứ nhất nếu tập thứ hai rỗng.

Toán tử tập hợp trong SQL: Hiệu năng và tối ưu hóa

Ảnh hưởng của các toán tử tập hợp đến hiệu năng truy vấn trong SQL có thể khác nhau tùy thuộc vào các yếu tố như kích thước tập dữ liệu, độ phức tạp của truy vấn và hệ quản trị cơ sở dữ liệu (DBMS) sử dụng.

Hãy phân tích các yếu tố chính và chiến lược tối ưu hóa.

Khối lượng dữ liệu và độ phức tạp truy vấn

Khi làm việc với lượng dữ liệu lớn, các toán tử tập hợp có thể tác động đáng kể đến hiệu năng vì kích thước các tập kết quả cần kết hợp, giao hoặc so sánh làm tăng thời gian xử lý cần thiết để thực hiện phép toán đó.

Các truy vấn phức tạp chứa nhiều truy vấn lồng, phép nối hoặc toán tử tập hợp có thể dẫn đến chi phí xử lý bổ sung và ảnh hưởng đến hiệu năng. Các phép toán xâu chuỗi hoặc lồng nhau có thể làm trầm trọng thêm hậu quả về hiệu năng.

Đánh chỉ mục và kỹ thuật tối ưu hóa

Đánh chỉ mục đúng cho các cột tham gia phép toán tập hợp có thể cải thiện đáng kể hiệu năng truy vấn. Chỉ mục giúp bộ máy cơ sở dữ liệu nhanh chóng xác định và truy xuất các hàng liên quan, giảm nhu cầu quét toàn bộ bảng và cải thiện thời gian thực thi.

Để cải thiện hiệu năng các truy vấn có dùng toán tử tập hợp, quản trị viên và nhà phát triển có thể áp dụng các kỹ thuật như viết lại truy vấn, phân tích kế hoạch thực thi và tối ưu hóa lược đồ. Các kỹ thuật như bộ nhớ đệm truy vấn và vật chất hóa view cũng có thể được dùng để tính trước và lưu trữ kết quả của các truy vấn phức tạp, giảm chi phí tính toán của phép toán tập hợp.

Bộ máy cơ sở dữ liệu và tài nguyên phần cứng

Hiệu năng các phép toán tập hợp có thể khác nhau tùy thuộc vào bộ máy cơ sở dữ liệu nền tảng và khả năng tối ưu hóa của nó. Các DBMS khác nhau có thể dùng các chiến lược và thuật toán tối ưu hóa khác nhau khi xử lý phép toán tập hợp, dẫn đến khác biệt về hiệu năng.

Sự sẵn có của tài nguyên phần cứng như CPU, bộ nhớ và I/O đĩa cũng ảnh hưởng đến hiệu năng của các truy vấn có dùng toán tử tập hợp. Tài nguyên phần cứng đầy đủ có thể giúp giảm nút thắt hiệu năng và đảm bảo thực thi truy vấn hiệu quả.

Toán tử tập hợp trong thực tiễn

Các toán tử tập hợp không chỉ là công cụ lý thuyết; chúng có các ứng dụng thực tế có thể ảnh hưởng đáng kể đến quyết định kinh doanh. Hãy cùng đi qua một ví dụ đơn giản về cách một công ty có thể dùng chúng để phân khúc tập khách hàng cho các chiến dịch tiếp thị theo mục tiêu.

Kịch bản

Hãy hình dung một công ty bán hàng cả trực tuyến và tại cửa hàng. Họ có hai tập dữ liệu riêng:

  1. Mua hàng trực tuyến: ID khách hàng, lịch sử mua, nhân khẩu học và vị trí cho người mua online.
  2. Giao dịch tại cửa hàng: Thông tin tương tự cho khách mua trực tiếp.

Sử dụng các toán tử tập hợp

Để có bức tranh đầy đủ về toàn bộ khách hàng, công ty sẽ dùng UNION để kết hợp hai tập dữ liệu vào một bảng, loại bỏ trùng lặp. Điều này cho họ một cái nhìn hợp nhất về toàn bộ tập khách hàng.

Tiếp theo, họ có thể dùng INTERSECT để xác định khách đã mua cả online lẫn tại cửa hàng. Phân khúc này đặc biệt giá trị vì họ tương tác cao với thương hiệu trên nhiều kênh.

Để tìm cơ hội khuyến khích mua sắm đa kênh, công ty có thể dùng EXCEPT. Ví dụ, SELECT * FROM online_purchases EXCEPT SELECT * FROM in_store_transactions sẽ tìm những khách chỉ mua online mà chưa mua tại cửa hàng. Khi đó công ty có thể nhắm nhóm này bằng các khuyến mãi khuyến khích đến cửa hàng.

Vượt ra ngoài phân khúc

Khi đã xác định các phân khúc, công ty có thể đi xa hơn, tinh chỉnh dựa trên các yếu tố bổ sung như nhân khẩu học hoặc lịch sử mua. Sự thấu hiểu chi tiết này cho phép họ điều chỉnh chiến dịch tiếp thị chính xác hơn.

Toán tử tập hợp so với JOIN

Cả toán tử tập hợp và SQL JOIN đều kết hợp dữ liệu từ nhiều truy vấn, nhưng cách hoạt động khác nhau. Câu hỏi cốt lõi là bạn muốn kết hợp hàng hay cột.

Tính năng Toán tử tập hợp JOIN
Kết hợp Hàng (xếp truy vấn theo chiều dọc) Cột (mở rộng hàng theo chiều ngang)
Yêu cầu Cùng số cột và kiểu dữ liệu tương thích Một cột khóa chung giữa các bảng
Dùng khi Gộp các tập dữ liệu tương tự, tìm phần giao hoặc khác biệt giữa các tập kết quả Bổ sung dữ liệu liên quan từ bảng khác vào một hàng
Xử lý trùng lặp UNION loại trùng; UNION ALL giữ trùng Phụ thuộc loại join và dữ liệu
Loại UNION, UNION ALL, INTERSECT, EXCEPT/MINUS INNER, LEFT, RIGHT, FULL OUTER, CROSS

Hạn chế và lưu ý khi dùng toán tử tập hợp

Khi dùng các toán tử tập hợp trong SQL, cần cân nhắc một số hạn chế và yếu tố có thể ảnh hưởng đến hiệu năng truy vấn, độ chính xác kết quả và tính dễ dùng tổng thể.

Tương thích kiểu dữ liệu và giá trị NULL

Các cột tương ứng trong các tập kết quả phải có kiểu dữ liệu tương thích. Hãy kiểm tra các cột tương ứng có kiểu tương thích trước khi kết hợp truy vấn. Không khớp kiểu gây lỗi và dễ bị bỏ sót.

Các toán tử tập hợp có thể xử lý giá trị NULL khác nhau tùy DBMS và toán tử cụ thể. Để tránh lỗi, nhà phát triển cần hiểu cách NULL được xử lý.

Tác động hiệu năng và hàng trùng lặp

Các phép toán tập hợp có thể ảnh hưởng đáng kể đến hiệu năng truy vấn, đặc biệt khi xử lý tập dữ liệu lớn hoặc phức tạp. Các yếu tố như đánh chỉ mục, tối ưu truy vấn và tài nguyên phần cứng có thể chi phối hiệu năng. Các kỹ thuật tối ưu và tinh chỉnh hiệu năng là cần thiết để giảm nút thắt.

Mặc định, các toán tử tập hợp loại bỏ hàng trùng khỏi kết quả. Tuy nhiên, trong một số trường hợp, việc giữ hàng trùng có thể cần thiết. Điều quan trọng là hiểu hành vi của các toán tử đối với hàng trùng và dùng kỹ thuật phù hợp để xử lý khi cần.

Thứ tự kết quả và giới hạn bộ nhớ

Các toán tử tập hợp không đảm bảo thứ tự kết quả trong đầu ra cuối cùng. Để sắp xếp kết quả kết hợp, hãy thêm mệnh đề ORDER BY ở cuối toàn bộ truy vấn, sau câu lệnh SELECT cuối cùng.

Các phép toán tập hợp có thể tiêu tốn nhiều bộ nhớ và tài nguyên, đặc biệt khi xử lý tập dữ liệu lớn. Cần cân nhắc các giới hạn bộ nhớ và tài nguyên để tránh suy giảm hiệu năng hoặc hệ thống không ổn định.

Độ phức tạp, khả năng bảo trì và tính tương thích giữa các DBMS

Các truy vấn phức tạp có nhiều toán tử tập hợp, truy vấn lồng và phép nối có thể khó hiểu, khó bảo trì và gỡ lỗi. Để cải thiện khả năng đọc và bảo trì, truy vấn cần ngắn gọn, có tài liệu tốt và có cấu trúc mô-đun.

Các toán tử tập hợp có thể có khác biệt về cú pháp và hành vi giữa các hệ quản trị cơ sở dữ liệu (DBMS). Biết các khác biệt này là rất quan trọng khi viết truy vấn SQL nhằm đảm bảo khả năng tương thích đa nền tảng.

Kết luận

Các toán tử tập hợp giải quyết một bài toán cụ thể: kết hợp hoặc so sánh các tập kết quả khi chưa biết trước hàng nào trùng nhau.

Chúng bao gồm UNION, INTERSECTEXCEPT: ba toán tử để kết hợp, so sánh và trừ các tập kết quả.

Nếu bạn muốn học thêm, hãy xem khóa học về Joining Data in SQL.

Câu hỏi thường gặp về toán tử SQL

Sự khác biệt giữa UNION ALL và UNION là gì?

UNION ALL bao gồm tất cả các hàng từ cả hai truy vấn, kể cả khi có trùng lặp. UNION loại bỏ các hàng trùng lặp.

UNION khác JOIN trong SQL như thế nào?

UNION kết hợp kết quả truy vấn theo chiều dọc, nối thêm các hàng từ truy vấn này vào truy vấn khác. JOIN kết hợp bảng theo chiều ngang, ghép các hàng dựa trên một cột liên quan và tạo ra tập kết quả rộng hơn.

Có lưu ý nào về hiệu năng khi dùng phép toán tập hợp không?

Các phép toán tập hợp có thể tốn kém về tính toán, đặc biệt khi xử lý tập dữ liệu lớn. Điều quan trọng là tối ưu các truy vấn riêng lẻ và sử dụng chỉ mục khi có thể để cải thiện hiệu năng.

Sự khác biệt giữa EXCEPT và NOT IN là gì?

EXCEPTNOT IN có thể tạo ra kết quả tương tự, nhưng chúng xử lý giá trị NULL khác nhau. EXCEPT coi các giá trị NULL là bằng nhau khi so sánh hàng, nên hai giá trị NULL ở cùng vị trí cột sẽ khiến một hàng bị loại. Trong khi đó, NOT IN không trả về hàng nào nếu truy vấn con chứa bất kỳ giá trị NULL nào, vì so sánh NULL là không xác định trong SQL. Với các tập dữ liệu lớn, EXCEPT cũng có thể dễ đọc hơn so với truy vấn con NOT IN tương quan.

Tôi có thể dùng ORDER BY với các toán tử tập hợp không?

Có, nhưng chỉ một lần, ở cuối cùng của toàn bộ truy vấn. Bạn không thể dùng ORDER BY bên trong từng câu lệnh SELECT trong một phép toán tập hợp. Để sắp xếp kết quả kết hợp, hãy thêm một mệnh đề ORDER BY sau câu lệnh SELECT cuối.

Ví dụ:

SELECT name FROM employees
UNION
SELECT name FROM contractors
ORDER BY name ASC;

MySQL có hỗ trợ INTERSECT và EXCEPT không?

MySQL bổ sung hỗ trợ INTERSECTEXCEPT từ phiên bản 8.0.31. Nếu bạn dùng phiên bản cũ hơn, bạn sẽ cần mô phỏng chúng: dùng INNER JOIN hoặc truy vấn lồng với IN để thay cho INTERSECT, và LEFT JOIN ... WHERE IS NULL hoặc truy vấn lồng NOT IN để thay cho EXCEPT. Oracle dùng MINUS thay cho EXCEPT.


Kurtis Pykes 's photo
Author
Kurtis Pykes
LinkedIn
Chủ đề

Tìm hiểu thêm về SQL!

Tracks

Kỹ sư Dữ liệu Hỗ trợ trong SQL

30 giờ
Học các kiến thức cơ bản về kỹ thuật dữ liệu: thiết kế cơ sở dữ liệu và kho dữ liệu, làm việc với các công nghệ bao gồm PostgreSQL và Snowflake!
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow
Có liên quan

blogs

Claude Opus 4.6: Tính năng, điểm chuẩn, các bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu bảng xếp hạng về mã hóa theo hướng tác nhân và suy luận phức tạp. Thêm nữa, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem thêmXem thêm