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.
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.
SELECT column1, column2, ... FROM table1 UNION SELECT column1, column2, ... FROM table2;
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;
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
CustomerID | Name |
---|---|
1 | Alice |
2 | Bob |
CustomersUK
CustomerID | Name |
---|---|
3 | Charlie |
4 | David |
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ả:
CustomerID | Name |
---|---|
1 | Alice |
2 | Bob |
3 | Charlie |
4 | David |
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ó).
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
CustomerID | Name |
---|---|
1 | Alice |
2 | Bob |
CustomersUK
CustomerID | Name |
---|---|
2 | Bob |
3 | Charlie |
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ả:
CustomerID | Name |
---|---|
1 | Alice |
2 | Bob |
2 | Bob |
3 | Charlie |
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 Bob vì UNION ALL không loại bỏ các hàng trùng lặp.
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 Customers2019 và Customers2020 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;
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.
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.
SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2 ORDER BY column1;
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.