MySQL UNION là gì ? Và MySQL UNION dùng như thế nào ?

04/07/2023 - lượt xem
Chia sẻ
 
Rate this post

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 UNIONORDER 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:

 

 

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về Kiến thức

    Xem thêm