Giới thiệu
Để lấy các giá trị duy nhất (distinct) từ hai cột khác nhau và gộp thành một danh sách đơn, dùng UNION (mặc định loại trùng) thay vì UNION ALL (giữ trùng).
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Name1 VARCHAR(100),
Name2 VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES
('Adam', 'Bob'), ('Adam', 'Bob'), ('David', 'Chris');
Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+-------+-------+ | Name1 | Name2 | +-------+-------+ | Adam | Bob | | Adam | Bob | | David | Chris | +-------+-------+
Truy vấn UNION
mysql> SELECT Name1 FROM DemoTable UNION SELECT Name2 FROM DemoTable;
Kết quả (đã loại trùng, sắp xếp mặc định)
+-------+ | Name1 | +-------+ | Adam | | David | | Bob | | Chris | +-------+
UNION vs UNION ALL
| Đặc điểm | UNION | UNION ALL |
|---|---|---|
| Xử lý trùng lặp | Loại bỏ (DISTINCT) | Giữ lại tất cả |
| Hiệu năng | Chậm hơn (phải sort/unique) | Nhanh hơn |
| Thứ tự | Có sắp xếp | Giữ thứ tự truy vấn |
Mở rộng: Thêm cột nguồn
SELECT Name1 AS Name, 'Name1' AS Source FROM DemoTable UNION SELECT Name2, 'Name2' FROM DemoTable;
Kết quả sẽ có cột Source cho biết tên đến từ cột nào.