Đây là các phép toán tập hợp (set operation) kết hợp kết quả của hai truy vấn. UNION gộp các dòng (loại bỏ trùng lặp), INTERSECT trả về các dòng có ở cả hai, EXCEPT trả về các dòng có ở truy vấn đầu nhưng không có ở truy vấn thứ hai. Chúng thao tác trên toàn bộ tập kết quả theo chiều dọc (xếp chồng các dòng), khác với JOIN (kết hợp các cột theo chiều ngang).
UNION — gộp kết quả (đã khử trùng)
-- gộp hai tập kết quả thành một, loại bỏ trùng lặp
SELECT name, email FROM customers
UNION
SELECT name, email FROM suppliers;
-- → tất cả name/email khác biệt từ CẢ HAI bảng, không trùng lặp
-- UNION ALL — giữ lại trùng lặp (nhanh hơn, không có bước khử trùng)
SELECT name FROM customers
UNION ALL
SELECT name FROM suppliers;
UNION xếp chồng các dòng của hai truy vấn (phải có các cột tương thích — cùng số lượng, kiểu tương thích), loại bỏ trùng lặp. UNION ALL giữ lại trùng lặp và nhanh hơn (không khử trùng) — dùng nó khi bạn biết không có trùng lặp hoặc không quan tâm.
INTERSECT — các dòng có ở CẢ HAI
-- những người vừa là customer VỪA là supplier
SELECT email FROM customers
INTERSECT
SELECT email FROM suppliers;
EXCEPT (hoặc MINUS trong Oracle) — các dòng có ở truy vấn đầu, không có ở truy vấn thứ hai
-- các customer KHÔNG phải supplier
SELECT email FROM customers
EXCEPT
SELECT email FROM suppliers;
Yêu cầu và lưu ý UNION vs UNION ALL
Yêu cầu cho các phép toán tập hợp:
✓ Cả hai truy vấn phải có CÙNG số lượng cột
✓ Các cột tương ứng phải có kiểu TƯƠNG THÍCH
✓ Tên cột lấy từ truy vấn ĐẦU TIÊN
UNION vs UNION ALL:
UNION → loại bỏ trùng lặp (việc làm thêm — sắp xếp/so sánh)
UNION ALL → giữ mọi dòng (nhanh hơn) — ưu tiên dùng khi không cần khử trùng
UNION vs JOIN
JOIN → kết hợp các bảng theo CHIỀU NGANG (thêm cột từ các dòng liên quan)
UNION → kết hợp các kết quả theo CHIỀU DỌC (xếp chồng các dòng từ các truy vấn riêng biệt)
→ Mục đích khác nhau: JOIN cho dữ liệu liên quan giữa các bảng, UNION để gộp
các tập kết quả tương tự.
Tại sao điều này quan trọng
Các phép toán tập hợp (UNION, INTERSECT, EXCEPT) là các tính năng SQL hữu ích để kết hợp các tập kết quả, và hiểu chúng có giá trị cho các truy vấn cần gộp, giao hoặc trừ dữ liệu từ nhiều nguồn.
Được dùng nhiều nhất là UNION (gộp các dòng từ hai truy vấn — như gộp dữ liệu tương tự từ các bảng khác nhau), và một khác biệt thực tế quan trọng là UNION vs UNION ALL: UNION loại bỏ trùng lặp (kéo theo chi phí sắp xếp/so sánh) trong khi UNION ALL giữ mọi dòng và nhanh hơn — biết ưu tiên UNION ALL khi không cần khử trùng là một thực hành hiệu năng hữu ích. INTERSECT (các dòng có ở cả hai) và EXCEPT (các dòng có ở truy vấn đầu nhưng không có ở truy vấn thứ hai) xử lý gọn logic hiệu tập hợp.
Hiểu các yêu cầu (số lượng cột khớp nhau và kiểu tương thích) và khác biệt khái niệm then chốt giữa các phép toán tập hợp và JOIN — các phép toán tập hợp kết hợp kết quả theo chiều dọc (xếp chồng các dòng từ các truy vấn riêng biệt) trong khi JOIN kết hợp theo chiều ngang (thêm cột từ các dòng liên quan) — là quan trọng để chọn đúng công cụ.
Vì kết hợp các tập kết quả từ nhiều truy vấn là nhu cầu thực tế (gộp dữ liệu từ các bảng tương tự, tìm các mục chung hoặc khác biệt giữa các tập), và vì hiểu các phép toán, khác biệt hiệu năng UNION/UNION ALL và cách các phép toán tập hợp khác với JOIN giúp bạn diễn đạt các yêu cầu này đúng và hiệu quả, biết các phép toán tập hợp là kiến thức SQL hữu ích, liên quan thực tế bổ trợ cho JOIN và cho phép một lớp truy vấn liên quan đến gộp hoặc so sánh toàn bộ tập kết quả.
