Phương pháp
Sử dụng UNION (loại bỏ trùng lặp) hoặc UNION ALL (giữ trùng lặp) để gộp kết quả nhiều truy vấn SELECT.
Ví dụ
Tạo 2 bảng:
CREATE TABLE DemoTable1 (Value1 INT, Value2 INT);
CREATE TABLE DemoTable2 (Number1 INT, Number2 INT);
Chèn dữ liệu:
INSERT INTO DemoTable1 VALUES (10,29), (100,190), (40,101);
INSERT INTO DemoTable2 VALUES (100,290), (200,390), (50,170);
Gộp với UNION và sắp xếp:
(SELECT Value1, Value2 FROM DemoTable1)
UNION
(SELECT Number1 AS Value1, Number2 AS Value2 FROM DemoTable2)
ORDER BY Value1 DESC;
Kết quả:
+--------+--------+
| Value1 | Value2 |
+--------+--------+
| 200 | 390 |
| 100 | 290 |
| 100 | 190 |
| 50 | 170 |
| 40 | 101 |
| 10 | 29 |
+--------+--------+
Quy tắc UNION
- Số cột và thứ tự cột phải khớp nhau.
- Kiểu dữ liệu tương thích (numeric với numeric, string với string).
- Tên cột kết quả lấy từ SELECT đầu tiên (có thể dùng ALIAS để đồng nhất).
ORDER BYáp dụng cho toàn bộ kết quả gộp (viết ở cuối).
UNION vs UNION ALL
| Đặc điểm | UNION | UNION ALL |
|---|---|---|
| Trùng lặp | Loại bỏ (DISTINCT) | Giữ lại tất cả |
| Hiệu năng | Chậm hơn (cần sort/hash để dedup) | Nhanh hơn |
| Dùng khi | Cần kết quả unique | Biết chắc không trùng hoặc chấp nhận trùng |
Mẹo nâng cao
- Dùng
UNION ALL+ wrap trong subquery +DISTINCTnếu cần kiểm soát vị trí dedup. - Kết hợp với
LIMITtrong từng SELECT để phân trang union. - Có thể dùng
WITH(CTE) để tổ chức code rõ ràng hơn (MySQL 8.0+).