Toán tử UNION trong MySQL được sử dụng để kết hợp kết quả của hai hoặc nhiều câu lệnh SELECT thành một tập hợp kết quả duy nhất. Khi sử dụng UNION, các câu lệnh SELECT phải có cùng số lượng cột và các cột tương ứng phải có kiểu dữ liệu tương thích.

Cú Pháp Cơ Bản

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

Các Loại UNION

UNION: Kết hợp các tập kết quả của các câu lệnh SELECT và loại bỏ các hàng trùng lặp. Cú pháp ví dụ:

SELECT first_name FROM employees
UNION
SELECT first_name FROM managers;

UNION ALL: Kết hợp các tập kết quả của các câu lệnh SELECT mà không loại bỏ các hàng trùng lặp. Cú pháp ví dụ:

SELECT first_name FROM employees
UNION ALL
SELECT first_name FROM managers;

Quy Tắc Sử Dụng

  • Số Lượng Cột: Mỗi câu lệnh SELECT phải có cùng số lượng cột.
  • Kiểu Dữ Liệu: Các cột tương ứng trong các câu lệnh SELECT phải có kiểu dữ liệu tương thích.
  • Tên Cột: Tên cột trong tập kết quả cuối cùng được lấy từ câu lệnh SELECT đầu tiên.

Ví Dụ

Giả sử bạn có hai bảng: employeescontractors, và bạn muốn lấy danh sách tất cả các tên nhân viên và nhà thầu.

Bảng employees có thể được tạo bằng cách:

CREATE TABLE employees (
    employee_id INT,
    first_name VARCHAR(50)
);

Bảng contractors có thể được tạo bằng cách:

CREATE TABLE contractors (
    contractor_id INT,
    first_name VARCHAR(50)
);

Để kết hợp danh sách tên từ hai bảng này, bạn có thể sử dụng:

SELECT first_name FROM employees
UNION
SELECT first_name FROM contractors;

Kết quả là danh sách tất cả các tên từ cả hai bảng, với các tên trùng lặp được loại bỏ.

Để bao gồm cả các tên trùng lặp, bạn có thể sử dụng:

SELECT first_name FROM employees
UNION ALL
SELECT first_name FROM contractors;

Kết quả là danh sách tất cả các tên từ cả hai bảng, bao gồm các tên trùng lặp.

Ví Dụ Nâng Cao

Kết hợp Kết quả từ Các Bảng với Các Cột Khác Kiểu Dữ Liệu

Khi kết hợp các bảng có cột với kiểu dữ liệu khác nhau, bạn có thể sử dụng các hàm chuyển đổi kiểu dữ liệu để đồng bộ hóa kiểu dữ liệu của các cột tương ứng.

Ví dụ:

Giả sử bạn có hai bảng: employeesmanagers, trong đó bảng employees có cột salary kiểu DECIMAL, còn bảng managers có cột bonus kiểu INT. Bạn muốn kết hợp kết quả từ hai bảng này trong một truy vấn duy nhất.

SELECT employee_name, CAST(salary AS CHAR) AS compensation
FROM employees
UNION
SELECT manager_name, CAST(bonus AS CHAR) AS compensation
FROM managers;

Trong ví dụ này, hàm CAST được sử dụng để chuyển đổi kiểu dữ liệu của cột salarybonus thành kiểu CHAR để chúng có thể được kết hợp trong cùng một truy vấn.

Sử Dụng UNION với Các Điều Kiện Phức Tạp

Bạn có thể kết hợp các câu lệnh SELECT với điều kiện phức tạp để tạo ra các tập kết quả tinh vi hơn.

Ví dụ:

Giả sử bạn có hai bảng: ordersreturns, và bạn muốn lấy danh sách tất cả các đơn hàng và trả hàng trong tháng này.

SELECT order_id, 'Order' AS type
FROM orders
WHERE order_date BETWEEN '2024-09-01' AND '2024-09-30'
UNION
SELECT return_id, 'Return' AS type
FROM returns
WHERE return_date BETWEEN '2024-09-01' AND '2024-09-30';

Trong ví dụ này, kết quả từ hai bảng được kết hợp với nhau và một cột type được thêm vào để phân loại các bản ghi là “Order” hoặc “Return”.

Kết hợp Kết quả với Sắp Xếp và Giới Hạn

Bạn có thể kết hợp các câu lệnh SELECT với các lệnh ORDER BYLIMIT để sắp xếp và giới hạn số lượng bản ghi trong kết quả cuối cùng.

Ví dụ:

Giả sử bạn muốn kết hợp danh sách các sản phẩm còn hàng và các sản phẩm sắp hết hàng, sau đó sắp xếp chúng theo giá và chỉ lấy 10 sản phẩm đầu tiên.

(SELECT product_name, price
FROM in_stock_products
ORDER BY price DESC)
UNION
(SELECT product_name, price
FROM low_stock_products
ORDER BY price DESC)
ORDER BY price DESC
LIMIT 10;

Trong ví dụ này, kết quả từ hai bảng được sắp xếp theo giá giảm dần, và chỉ 10 sản phẩm đầu tiên được lấy.

Kết hợp Dữ Liệu từ Nhiều Cơ Sở Dữ Liệu

Bạn có thể sử dụng UNION để kết hợp dữ liệu từ các bảng thuộc các cơ sở dữ liệu khác nhau trong cùng một server MySQL.

Ví dụ:

Giả sử bạn có hai cơ sở dữ liệu: sales_dbhr_db, và bạn muốn lấy danh sách tất cả các nhân viên từ cả hai cơ sở dữ liệu.

SELECT employee_name FROM sales_db.employees
UNION
SELECT employee_name FROM hr_db.employees;

Trong ví dụ này, kết quả từ bảng employees của hai cơ sở dữ liệu khác nhau được kết hợp thành một tập kết quả duy nhất.

Tóm lại

Toán tử UNION trong MySQL không chỉ đơn thuần là công cụ kết hợp kết quả từ các truy vấn đơn giản mà còn cung cấp khả năng xử lý các tình huống phức tạp như kết hợp dữ liệu từ các bảng với các kiểu dữ liệu khác nhau, điều kiện phức tạp, sắp xếp và giới hạn kết quả, cũng như kết hợp dữ liệu từ nhiều cơ sở dữ liệu. Sử dụng UNION một cách hiệu quả có thể giúp bạn tích hợp và phân tích dữ liệu từ các nguồn khác nhau một cách linh hoạt và mạnh mẽ.