MySQL UNION

Tóm tắt: trong hướng dẫn này, bạn sẽ tìm hiểu 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 CHỌN vào một tập kết quả.

MySQL UNION operator

Toán tử MySQL UNION cho phép bạn kết hợp hai hoặc nhiều bộ kết quả truy vấn thành một bộ kết quả. Dưới đây minh họa cú pháp 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 kết quả của hai hoặc nhiều truy vấn bằng toán tử UNION, có 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 CHỌN phải giống nhau.
+ Thứ hai, các kiểu dữ liệu của cột phải giống nhau hoặc có thể chuyển đổi.

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 chỉ định rõ ràng toán tử DISTINCT.

Let’s see the following sample tables: t1 and 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);

The following statement combines result sets returned from t1 and t2 tables:

SELECT id
FROM t1
UNION
SELECT id
FROM t2;

The final result set contains the distinct values from separate result sets returned by the queries:

+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

Vì các hàng có giá trị 2 và 3 là trùng lặp, nên toán tử UNION đã loại bỏ nó và chỉ giữ lại các hàng riêng biệt.

Biểu đồ Venn sau đây minh họa sự kết hợp của hai tập kết quả đến từ các bảng t1 và t2:

Nếu bạn sử dụng UNION ALL một cách rõ ràng, các hàng trùng lặp, nếu có, vẫn nằm trong kết quả. Bởi vì 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 bản sao xuất hiện trong tập kết quả kết hợp do hoạt động UNION ALL.

UNION vs. JOIN

JOIN kết hợp các tập kết quả theo chiều ngang, UNION sẽ thêm kết quả được đặt theo chiều dọc. Hình ảnh sau đây minh họa sự khác biệt giữa UNION và THAM GIA:

MySQL UNION and column alias examples

We will use the customers and employees tables in the sample database for the demonstration:

Giả sử bạn muốn kết hợp tên và họ của cả nhân viên và khách hàng vào một tập kết quả, bạn có thể sử dụng toán tử UNION như sau:

SELECT 
    firstName, 
    lastName
FROM
    employees 
UNION 
SELECT 
    contactFirstName, 
    contactLastName
FROM
    customers;

Here is the output:

+---------------+-----------------+
| firstName     | lastName        |
+---------------+-----------------+
| Diane         | Murphy          |
| Mary          | Patterson       |
| Jeff          | Firrelli        |
| William       | Patterson       |
| Gerard        | Bondur          |
+---------------+-----------------+

Như bạn có thể thấy, toán tử MySQL UNION sử dụng tên cột của câu lệnh CHỌN đầu tiên để ghi nhãn các cột trong đầu ra.

Nếu bạn muốn sử dụng bí danh cột của riêng mình, bạn cần chỉ định rõ ràng chúng trong câu lệnh CHỌN đầu tiên như trong ví dụ sau:

SELECT 
    concat(firstName,' ',lastName) fullname
FROM
    employees 
UNION SELECT 
    concat(contactFirstName,' ',contactLastName)
FROM
    customers;
+--------------------------+
| fullname                 |
+--------------------------+
| Diane Murphy             |
| Mary Patterson           |
| Jeff Firrelli            |
| William Patterson        |
| Gerard Bondur            |
| Anthony Bow              |
| Leslie Jennings          |
+--------------------------+

Trong ví dụ này, thay vì sử dụng nhãn cột mặc định từ truy vấn đầu tiên, chúng tôi đã sử dụng tên đầy đủ bí danh cột để gắn nhãn đầu ra.

MySQL UNION and ORDER BY

Nếu bạn muốn sắp xếp kết quả của một liên kết, bạn sử dụng mệnh đề ORDER BY trong câu lệnh CHỌN 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;
+--------------------------+
| fullname                 |
+--------------------------+
| Adrian Huxley            |
| Akiko Shimamura          |
| Alejandra  Camino        |
| Alexander  Feuer         |
| Alexander  Semenov       |
| Allen Nelson             |
| Andy Fixter              |
+--------------------------+

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.

MySQL cũng cung cấp cho bạn 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 mệnh đề ORDER BY như sau:

SELECT 
    concat(firstName,' ',lastName) fullname
FROM
    employees 
UNION SELECT 
    concat(contactFirstName,' ',contactLastName)
FROM
    customers
ORDER BY 1;
+--------------------------+
| fullname                 |
+--------------------------+
| Adrian Huxley            |
| Akiko Shimamura          |
| Alejandra  Camino        |
| Alexander  Feuer         |
| Alexander  Semenov       |
| Allen Nelson             |
| Andy Fixter              |
| Ann  Brown               |
| Anna O'Hara              |
+--------------------------+

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ả.

Last updated