Trong SQL, UNION là một công cụ mạnh mẽ cho phép bạn kết hợp kết quả từ nhiều truy vấn thành một tập kết quả duy nhất. Điều này đặc biệt hữu ích khi bạn muốn truy xuất dữ liệu từ nhiều bảng khác nhau hoặc từ các truy vấn khác nhau mà vẫn trả về một tập hợp kết quả duy nhất. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về cách sử dụng UNION, các trường hợp ứng dụng cụ thể, và các điều kiện cần lưu ý khi sử dụng.

1. UNION là gì?

1.1. Khái Niệm

UNION được sử dụng để kết hợp kết quả của hai hoặc nhiều truy vấn SELECT. Nó loại bỏ các hàng trùng lặp, chỉ giữ lại các giá trị duy nhất trong kết quả. Nếu bạn muốn giữ lại các hàng trùng lặp, bạn có thể sử dụng UNION ALL.

1.2. Điều Kiện Sử Dụng

  • Số lượng cột và thứ tự của các cột trong các truy vấn phải giống nhau.
  • Các cột tương ứng phải có kiểu dữ liệu tương thích (ví dụ: nếu cột thứ nhất là kiểu số trong truy vấn đầu tiên, nó cũng phải là kiểu số trong truy vấn thứ hai).

2. Cú Pháp UNION

2.1. Cú Pháp Cơ Bản

SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;

2.2. Cú Pháp UNION ALL

Nếu bạn muốn giữ lại các hàng trùng lặp trong kết quả, bạn có thể sử dụng UNION ALL thay vì UNION:

SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;

3. Ví Dụ Minh Họa

3.1. Ví Dụ Về UNION

Giả sử bạn có hai bảng: CustomersUSA (khách hàng tại Mỹ) và CustomersUK (khách hàng tại Anh).

CustomersUSA

CustomerIDName
1Alice
2Bob

CustomersUK

CustomerIDName
3Charlie
4David

Bạn muốn lấy danh sách khách hàng từ cả hai bảng mà không có sự trùng lặp, bạn có thể sử dụng UNION như sau:

SELECT CustomerID, Name
FROM CustomersUSA
UNION
SELECT CustomerID, Name
FROM CustomersUK;

Kết quả:

CustomerIDName
1Alice
2Bob
3Charlie
4David

Kết quả sẽ trả về toàn bộ khách hàng từ cả hai bảng và loại bỏ các hàng trùng lặp (nếu có).

3.2. Ví Dụ Về UNION ALL

Nếu bạn muốn giữ lại các hàng trùng lặp giữa hai bảng, bạn có thể sử dụng UNION ALL. Giả sử có khách hàng trùng lặp ở cả hai bảng.

CustomersUSA

CustomerIDName
1Alice
2Bob

CustomersUK

CustomerIDName
2Bob
3Charlie

Câu truy vấn sau sẽ kết hợp dữ liệu từ hai bảng và giữ lại tất cả các hàng trùng lặp:

SELECT CustomerID, Name
FROM CustomersUSA
UNION ALL
SELECT CustomerID, Name
FROM CustomersUK;

Kết quả:

CustomerIDName
1Alice
2Bob
2Bob
3Charlie

Trong trường hợp này, bạn sẽ thấy có hai hàng trùng lặp về khách hàng BobUNION ALL không loại bỏ các hàng trùng lặp.

4. Ứng Dụng UNION Trong Các Tình Huống Thực Tế

4.1. Kết Hợp Dữ Liệu Từ Nhiều Bảng

Khi bạn có nhiều bảng lưu trữ dữ liệu tương tự (ví dụ: các bảng lưu thông tin khách hàng từ các quốc gia khác nhau), UNION là cách tốt để kết hợp dữ liệu từ các bảng này thành một kết quả duy nhất.

Ví dụ, bạn có các bảng Customers2019Customers2020 lưu trữ khách hàng theo từng năm. Để lấy danh sách khách hàng từ cả hai bảng, bạn có thể dùng UNION:

SELECT CustomerID, Name
FROM Customers2019
UNION
SELECT CustomerID, Name
FROM Customers2020;

4.2. Kết Hợp Dữ Liệu Từ Nhiều Truy Vấn Khác Nhau

UNION cũng có thể được sử dụng để kết hợp kết quả từ nhiều truy vấn khác nhau. Ví dụ, bạn muốn lấy tất cả các sản phẩm đã bán tại cả cửa hàng và trực tuyến:

SELECT ProductID, ProductName
FROM StoreSales
UNION
SELECT ProductID, ProductName
FROM OnlineSales;

Kết quả sẽ bao gồm danh sách tất cả các sản phẩm đã bán tại cả cửa hàng và trực tuyến, loại bỏ các sản phẩm trùng lặp.

4.3. Kết Hợp Dữ Liệu Khi Kiểu Dữ Liệu Không Trùng Khớp

Trường hợp bạn cần kết hợp dữ liệu từ hai truy vấn nhưng kiểu dữ liệu không hoàn toàn giống nhau, bạn có thể cần sử dụng các hàm chuyển đổi dữ liệu. Ví dụ, nếu một bảng lưu trữ ngày dưới dạng DATE và bảng khác lưu dưới dạng VARCHAR, bạn cần chuyển đổi chúng về cùng một kiểu dữ liệu:

SELECT CustomerID, CAST(OrderDate AS VARCHAR) AS Date
FROM Orders2019
UNION
SELECT CustomerID, OrderDate
FROM Orders2020;

Trong ví dụ trên, cột OrderDate từ bảng Orders2019 được chuyển sang kiểu VARCHAR để tương thích với cột OrderDate của bảng Orders2020.

5. Lưu Ý Khi Sử Dụng UNION

  • UNION tự động loại bỏ các hàng trùng lặp, do đó có thể làm giảm hiệu suất khi xử lý lượng dữ liệu lớn. Nếu bạn không cần loại bỏ các hàng trùng lặp, hãy sử dụng UNION ALL để cải thiện hiệu suất.
  • Các cột trong truy vấn phải có cùng số lượng và kiểu dữ liệu tương thích.
  • Sắp xếp thứ tự kết quả bằng ORDER BY chỉ có thể được sử dụng một lần sau cùng tất cả các phép UNION:
SELECT column1, column2
FROM table1
UNION
SELECT column1, column2
FROM table2
ORDER BY column1;

6. Kết Luận

UNION là một công cụ mạnh mẽ giúp bạn kết hợp dữ liệu từ nhiều truy vấn thành một tập kết quả duy nhất. Tuy nhiên, bạn cần phải hiểu rõ cách sử dụng để đảm bảo tính nhất quán của dữ liệu và tối ưu hóa hiệu suất. Hãy sử dụng UNION khi bạn cần loại bỏ các hàng trùng lặp và UNION ALL khi bạn muốn giữ lại tất cả các hàng, bao gồm cả những hàng trùng lặp. Việc nắm vững kỹ thuật này sẽ giúp bạn xử lý dữ liệu trong SQL hiệu quả hơn.