1. Giới thiệu
SQL UNION là một toán tử trong SQL được sử dụng để kết hợp kết quả của hai hoặc nhiều truy vấn SELECT khác nhau thành một tập kết quả duy nhất. Toán tử UNION giúp gộp dữ liệu từ nhiều truy vấn lại với nhau mà không có các giá trị trùng lặp.
SQL UNION có hai biến thể:
- UNION: Kết hợp kết quả của các truy vấn và loại bỏ các bản ghi trùng lặp.
- UNION ALL: Kết hợp kết quả của các truy vấn và giữ lại tất cả các bản ghi, kể cả các bản ghi trùng lặp.
Bài viết này sẽ hướng dẫn bạn cách sử dụng SQL UNION và SQL UNION ALL, cùng với các ví dụ minh họa từ một bảng dữ liệu giả định.
2. Bảng dữ liệu giả định
Giả sử chúng ta có hai bảng employees_2023 và employees_2024, chứa thông tin về nhân viên qua các năm khác nhau.
Bảng employees_2023:
| employee_id | first_name | last_name | department |
|---|---|---|---|
| 1 | John | Doe | Sales |
| 2 | Jane | Smith | Marketing |
| 3 | Bob | Johnson | Sales |
| 4 | Alice | Brown | HR |
Bảng employees_2024:
| employee_id | first_name | last_name | department |
|---|---|---|---|
| 5 | Charlie | Green | Marketing |
| 6 | Eva | White | Sales |
| 7 | John | Doe | IT |
3. SQL UNION là gì?
SQL UNION được sử dụng để kết hợp kết quả từ nhiều truy vấn SELECT thành một tập kết quả duy nhất. Các quy tắc khi sử dụng UNION bao gồm:
- Các truy vấn SELECT phải có cùng số lượng cột.
- Các cột phải có kiểu dữ liệu tương tự.
- Thứ tự các cột trong mỗi truy vấn phải giống nhau.
Cú pháp của SQL UNION:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;Cú pháp của SQL UNION ALL:
SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;4. Sử dụng SQL UNION và UNION ALL
a. Sử dụng SQL UNION để loại bỏ các bản ghi trùng lặp
UNION sẽ loại bỏ các bản ghi trùng lặp trong kết quả trả về.
Ví dụ 1: Kết hợp tất cả nhân viên từ hai năm 2023 và 2024, loại bỏ các bản ghi trùng lặp
SELECT first_name, last_name, department
FROM employees_2023
UNION
SELECT first_name, last_name, department
FROM employees_2024;Kết quả:
| first_name | last_name | department |
|---|---|---|
| John | Doe | Sales |
| Jane | Smith | Marketing |
| Bob | Johnson | Sales |
| Alice | Brown | HR |
| Charlie | Green | Marketing |
| Eva | White | Sales |
| John | Doe | IT |
Trong ví dụ này, UNION kết hợp các bản ghi từ hai bảng và loại bỏ bản ghi trùng lặp, nghĩa là John Doe ở bảng employees_2023 (Sales) và bảng employees_2024 (Sales) chỉ xuất hiện một lần.
b. Sử dụng SQL UNION ALL để giữ lại tất cả các bản ghi
UNION ALL sẽ không loại bỏ các bản ghi trùng lặp và trả về tất cả các kết quả từ các truy vấn SELECT.
Ví dụ 2: Kết hợp tất cả nhân viên từ hai năm 2023 và 2024, giữ lại các bản ghi trùng lặp
SELECT first_name, last_name, department
FROM employees_2023
UNION ALL
SELECT first_name, last_name, department
FROM employees_2024;Kết quả:
| first_name | last_name | department |
|---|---|---|
| John | Doe | Sales |
| Jane | Smith | Marketing |
| Bob | Johnson | Sales |
| Alice | Brown | HR |
| Charlie | Green | Marketing |
| Eva | White | Sales |
| John | Doe | Sales |
| John | Doe | IT |
Trong ví dụ này, UNION ALL trả về tất cả các bản ghi, bao gồm cả bản ghi trùng lặp của John Doe trong bảng employees_2023 và employees_2024 ở cùng phòng ban Sales.
5. Các ví dụ về SQL UNION
Ví dụ 1: Kết hợp nhân viên từ nhiều phòng ban khác nhau
Giả sử bạn có một bảng sales_employees và một bảng marketing_employees. Bạn muốn kết hợp thông tin về nhân viên của cả hai phòng ban:
SELECT first_name, last_name
FROM sales_employees
UNION
SELECT first_name, last_name
FROM marketing_employees;Ví dụ 2: Kết hợp dữ liệu từ nhiều bảng và loại bỏ bản ghi trùng lặp
Bạn muốn kết hợp các nhân viên từ bảng employees_2023 và employees_2024, nhưng loại bỏ các bản ghi trùng lặp:
SELECT first_name, last_name
FROM employees_2023
UNION
SELECT first_name, last_name
FROM employees_2024;Ví dụ 3: Kết hợp tất cả nhân viên từ các năm và giữ lại bản ghi trùng lặp
Nếu bạn muốn giữ lại tất cả các bản ghi từ các năm khác nhau, kể cả khi có sự trùng lặp:
SELECT first_name, last_name
FROM employees_2023
UNION ALL
SELECT first_name, last_name
FROM employees_2024;Ví dụ 4: Kết hợp dữ liệu từ hai bảng có cùng cấu trúc và thêm cột tính toán
Bạn có thể sử dụng UNION để kết hợp dữ liệu và thêm cột tính toán để phân biệt các nhân viên của các năm khác nhau:
SELECT first_name, last_name, '2023' AS year
FROM employees_2023
UNION
SELECT first_name, last_name, '2024' AS year
FROM employees_2024;Kết quả:
| first_name | last_name | year |
|---|---|---|
| John | Doe | 2023 |
| Jane | Smith | 2023 |
| Bob | Johnson | 2023 |
| Alice | Brown | 2023 |
| Charlie | Green | 2024 |
| Eva | White | 2024 |
| John | Doe | 2024 |
6. Một số lưu ý khi sử dụng SQL UNION
a. Các cột phải tương thích về kiểu dữ liệu
Các truy vấn kết hợp với UNION hoặc UNION ALL phải có cùng số lượng cột và các cột phải có kiểu dữ liệu tương thích. Nếu không, MySQL sẽ báo lỗi.
b. Thứ tự của các cột trong truy vấn
Thứ tự của các cột trong mỗi truy vấn phải giống nhau. Nếu thứ tự các cột khác nhau, kết quả sẽ không đúng hoặc có thể gây lỗi.
c. Hiệu suất khi sử dụng UNION
Việc sử dụng UNION có thể ảnh hưởng đến hiệu suất khi kết hợp các bảng lớn, đặc biệt khi MySQL phải loại bỏ các bản ghi trùng lặp. Trong trường hợp bạn không cần loại bỏ bản ghi trùng lặp, nên sử dụng UNION ALL để tránh việc so sánh dữ liệu không cần thiết.
Kết luận
SQL UNION là một công cụ mạnh mẽ giúp bạn kết hợp kết quả từ nhiều truy vấn SELECT vào một tập kết quả duy nhất. UNION loại bỏ các bản ghi trùng lặp, trong khi UNION ALL giữ lại tất cả các bản ghi. Hiểu rõ cách sử dụng hai toán tử này sẽ giúp bạn làm việc hiệu quả hơn với dữ liệu từ nhiều nguồn khác nhau trong cơ sở dữ liệu.
Hãy thử áp dụng các ví dụ này trong các bài tập và dự án thực tế trên CodeTutHub để nắm vững hơn về cách sử dụng SQL UNION và SQL UNION ALL trong MySQL!









