Các phép hợp tập hợp gộp kết quả của hai SELECT (phải cùng số cột và kiểu tương thích) theo chiều dọc:
UNION: gộp rồi loại bỏ hàng trùng → phải sắp xếp/băm để khử trùng nên tốn thêm chi phí.UNION ALL: gộp và giữ nguyên mọi hàng (kể cả trùng) → nhanh hơn vì không khử trùng. Mặc định nên dùngUNION ALLkhi biết chắc không có trùng (hoặc trùng không sao).INTERSECT: giữ hàng xuất hiện ở cả hai truy vấn.EXCEPT(Oracle gọi làMINUS): giữ hàng có ở truy vấn đầu mà không có ở truy vấn sau.
sql
-- Gộp email khách VIP và khách mới, giữ mọi hàng (kể cả trùng)
SELECT email FROM vip_customers
UNION ALL
SELECT email FROM new_customers;
-- Đổi UNION ALL → UNION nếu cần loại email trùng (thêm bước khử trùng)Khác với JOIN: JOIN ghép theo cột (chiều ngang), còn UNION xếp theo hàng (chiều dọc).
- Mẹo phỏng vấn: chọn
UNION ALLnếu không cần khử trùng — tránh chi phí sort ẩn. - Lưu ý:
ORDER BYchỉ đặt ở cuối toàn bộ phép hợp (không đặt vào từng SELECT con); tên cột kết quả lấy theo SELECT đầu tiên.