Trong bài viết này, chúng ta sẽ cùng học cách sử dụng toán tử MySQL UNION
để kết hợp hai hoặc nhiều tập kết quả từ nhiều câu lệnh SELECT
vào một tập kết quả duy nhất.
MySQL UNION là gì ?
UNION
là một toán tử được sử dụng trong MySQL, nó cho phép bạn kết hợp hai hoặc nhiều tập kết quả của truy vấn thành một tập kết quả duy nhất. Dưới đây là một cách viết của toán tử UNION
:
SELECT column_list UNION [DISTINCT | ALL] SELECT column_list UNION [DISTINCT | ALL] SELECT column_list ...
Để kết hợp tập hợp kết quả của hai hoặc nhiều truy vấn bằng cách sử dụng toán tử UNION
, đây là các quy tắc cơ bản mà bạn phải tuân theo:
- Đầu tiên, số lượng và thứ tự của các cột xuất hiện trong tất cả các câu lệnh
SELECT
phải giống nhau. - Thứ hai, kiểu dữ liệu của các cột phải giống nhau hoặc tương thích.
Theo mặc định,toán tử UNION
loại bỏ các hàng trùng lặp ngay cả khi bạn không sử dụng toán tử DISTINCT
.
Hãy xem các bảng mẫu sau: t1
và t2
:
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; CREATE TABLE t1 ( id INT PRIMARY KEY ); CREATE TABLE t2 ( id INT PRIMARY KEY ); INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t2 VALUES (2),(3),(4);
Câu lệnh sau kết hợp các tập kết quả được trả về từ các bảng t1
và t2
:
SELECT id FROM t1 UNION SELECT id FROM t2;
Tập hợp kết quả cuối cùng chứa các giá trị riêng biệt từ các tập hợp kết quả riêng biệt do truy vấn trả về:
+----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | +----+ 4 rows in set (0.00 sec)
Bởi vì các hàng có giá trị 2 và 3 là trùng lặp nên đã UNION
loại bỏ chúng và chỉ giữ lại các giá trị duy nhất.
Biểu đồ Venn sau đây minh họa sự kết hợp của hai tập hợp kết quả đến từ bảng t1
và t2
:
Nếu bạn sử dụng UNION ALL
, các hàng trùng lặp, nếu có, sẽ vẫn còn trong kết quả. Do UNION ALL
không cần xử lý các bản sao nên nó hoạt động nhanh hơn UNION DISTINCT
.
SELECT id FROM t1 UNION ALL SELECT id FROM t2;
+----+ | id | +----+ | 1 | | 2 | | 3 | | 2 | | 3 | | 4 | +----+ 6 rows in set (0.00 sec)
Như bạn có thể thấy, các mục trùng lặp xuất hiện trong tập kết quả kết hợp do UNION ALL
thao tác.
UNION
so với JOIN
JOIN
thì một tập kết quả kết hợp theo chiều ngang, còn UNION
sẽ là một tập hợp kết quả nối thêm theo chiều dọc. Hình ảnh sau đây minh họa sự khác biệt giữa UNION
và JOIN
:
ví dụ về MySQL UNION
và bí danh cột
Chúng ta sẽ sử dụng các bảng customers
và employees
trong cơ sở dữ liệu mẫu để minh họa:
Giả sử bạn muốn kết hợp họ và tên của nhân viên và khách hàng vào một tập kết quả duy nhất, bạn có thể sử dụng toán tử UNION
như sau:
SELECT firstName, lastName FROM employees UNION SELECT contactFirstName, contactLastName FROM customers;
Như bạn có thể thấy từ đầu ra, MySQL UNION
sử dụng tên cột của câu lệnh SELECT
đầu tiên cho tiêu đề cột của đầu ra.
Nếu bạn muốn sử dụng các tiêu đề cột khác, bạn cần sử dụng bí danh cột một cách rõ ràng trong câu lệnh SELECT
đầu tiên như minh họa trong ví dụ sau:
SELECT CONCAT(firstName,' ',lastName) fullname FROM employees UNION SELECT CONCAT(contactFirstName,' ',contactLastName) FROM customers;
kết quả:
Ví dụ này sử dụng tiêu đề cột của truy vấn đầu tiên cho đầu ra. Nó sử dụng hàm CONCAT()
để nối tên, dấu cách và họ thành một tên đầy đủ.
MySQL UNION
và ORDER BY
Nếu bạn muốn sắp xếp tập kết quả của một phép hợp, bạn sử dụng một mệnh đề ORDER BY
trong câu lệnh SELECT
cuối cùng như trong ví dụ sau:
SELECT concat(firstName,' ',lastName) fullname FROM employees UNION SELECT concat(contactFirstName,' ',contactLastName) FROM customers ORDER BY fullname;
Lưu ý rằng nếu bạn đặt mệnh đề ORDER BY
trong mỗi câu lệnh SELECT
, nó sẽ không ảnh hưởng đến thứ tự của các hàng trong tập kết quả cuối cùng.
Để phân biệt giữa nhân viên và khách hàng, bạn có thể thêm một cột như được hiển thị trong truy vấn sau:
SELECT CONCAT(firstName, ' ', lastName) fullname, 'Employee' as contactType FROM employees UNION SELECT CONCAT(contactFirstName, ' ', contactLastName), 'Customer' as contactType FROM customers ORDER BY fullname
MySQL cũng cung cấp cho bạn một tùy chọn thay thế để sắp xếp tập kết quả dựa trên vị trí cột bằng cách sử dụng mệnh đề ORDER BY
như sau:
SELECT CONCAT(firstName,' ',lastName) fullname FROM employees UNION SELECT CONCAT(contactFirstName,' ',contactLastName) FROM customers ORDER BY 1;
Tuy nhiên, việc sắp xếp tập hợp kết quả theo vị trí cột không phải là một cách thực hành tốt.
Tổng kết
Trong hướng dẫn này, bạn đã học cách sử dụng câu lệnh MySQL UNION
để kết hợp dữ liệu từ nhiều truy vấn vào một tập kết quả duy nhất.
Các bạn có thể tham khảo: https://www.mysqltutorial.org/sql-union-mysql.aspx
Các bài viết liên quan: