Bài 12: Toán tử UNION trong MySQL

Học Mysql 14/02/2017 10:26 1767
Trong bài viết này bạn sẽ học được cách sử dụng toán tử MySQL UNION để kết hợp hai hay nhiều kết quả từ nhiều câu lệnh SELECT vào trong một kết quả duy nhất.

Toán tử MySQL UNION cho phép bạn kết hợp hai hay nhiều kết quả từ nhiều bảng vào một kết quả.

Cú pháp:

SELECT column1, column2
UNION [DISTINCT | ALL]
SELECT column1, column2
UNION [DISTINCT | ALL]
…

Một số quy tắc bạn cần phải tuân theo khi sử dụng toán tử MySQL UNION.

  • Số lượng các cột xuất hiện trong mỗi câu lệnh SELECT phải bằng nhau.
  • Các cột xuất hiện ở các vị trí tương ứng của từng câu lệnh SELECT phải có cùng kiểu dữ liệu.

Theo mặc định, Toán tử UNION loại bỏ các hàng trùng lặp từ các kết quả ngay cả khi bạn không sử dụng mệnh đề DISTINCT một cách rõ ràng. Do đó, người ta nói rằng mệnh đề UNION là phím tắt của UNION DISTINCT

Nếu bạn sử dụng UNION ALL thì các bản ghi trùng lặp vẫn xuất hiện trong tập kết quả. Các UNION ALL thực hiện nhanh hơn so với UNION DISTINCT.

1. Sử dụng MySQL UNION có Alias.

Ví dụ: Sử dụng MySQL UNION để kết hợp dữ liệu từ hai bảng customers và employees trong CSDL mẫu.

SELECT customerNumber id, contactLastname name
FROM customers
UNION
SELECT employeeNumber id,firstname name
FROM employees

Try In Out

 

Kết quả:

 

2. Sử dụng MySQL UNION không có Alias.

Trong ví dụ trên, Tôi sử dụng bí danh cho mỗi cột trong câu lệnh SELECT. Điều gì sẽ xẩy ra nếu chúng ta không sử dụng Alias cho các cột thì MySQL sẽ sử dụng tên của các cột trong câu lệnh SELECT đầu tiên làm các tên cột cho kết quả.

Ví dụ: SELECT kết hợp giữa bảng customersemployees không sử dụng Alias.

(SELECT customerNumber, contactLastname
FROM customers)
UNION
(SELECT employeeNumber, firstname
FROM employees)
ORDER BY contactLastname, customerNumber

Try In Out

 

Kết quả:

Như bạn đã thấy hai tên cột là customerNumbercontactLastname là hai tên cột của câu lệnh SELECT đầu tiên được sử dụng làm tên cột cho kết quả trả về.

3. MySQL UNION với mệnh đề ORDER BY

Nếu bạn muốn sắp xếp kết quả trả về từ câu lệnh SELECT có sử dụng UNION. Bạn cần sử dụng mênh đề ORDER BY ở cuối của câu lệnh SELECT. Lưu ý là bạn có thể đặt các câu lệnh SELECT trong dấu () và đặt mệnh đề ORDER BY ở cuối cùng của câu lệnh SELECT.

Ví dụ:

(SELECT customerNumber id,contactLastname name
FROM customers)
UNION
(SELECT employeeNumber id,firstname name
FROM employees)
ORDER BY name,id

Try In Out

 

Trong ví dụ trên đây thì đâu tiên chúng sẽ kết hợp id, name của cả hai bảng employeescustomers sử dụng toán tử UNION. Sau đó chúng mới sắp xếp kết quả bở sử dụng toán tử UNION.

Chú ý rằng chúng ta đặt câu SELECT bên trong dấu ngoặc đơn và đặt mệnh đề ORDER BY ở cuối cùng của câu lệnh. Nếu bạn đặt các mệnh đề ORDER BY bên trong mỗi câu lệnh SELECT, nó sẽ không được áp dụng trong kết quả cuối cùng được tạo ra bởi toán tử UINON .

MySQL cũng cung cấp cho chúng ta một số tùy chọn cho phép bạn sắp xếp kết quả dựa trên vị trí cột sử dụng mệnh đề ORDER BY:

Ví dụ:

(SELECT customerNumber, contactLastname
FROM customers)
UNION
(SELECT employeeNumber,firstname
FROM employees)
ORDER BY 2, 1

Try In Out

 

4. MySQL UNION với các hàm tổng hợp.

Ban có thể sử dụng một số hàm tổng hợp e.g: COUNT, SUM, AVG để tính toán dựa trên tập kết quả trả về từ câu lệnh SELECT có sử dụng toán tử UNION.

Ví dụ:

SELECT count(*) as totalRecord 
FROM (
	(SELECT customerNumber as ID,customerName as Name FROM customers)
	UNION (SELECT employeeNumber as ID,firstName as Name FROM employees)
) AS mixTable

Try In Out

 

5. MySQL UNION với mệnh đề WHERE.

Nếu bạn muốn lọc kết quả trả về từ câu lệnh SELECT sử dụng toán tử UNION. Bạn cần sử dụng mện đề WHERE cho phép bạn thiết lập một điều kiện lọc dựa vào tập kết quả trả về của câu lệnh SELECT.

Ví dụ:

SELECT * FROM (
	(SELECT customerNumber as ID,customerName as Name FROM customers)
	UNION 
	(SELECT employeeNumber as ID,firstName as Name FROM employees)
) AS mixTable
WHERE mixTable.`Name` like '%Australian%'

Try In Out

Kết quả:

6. Tổng kết.

Trong bài viết này tôi đã hướng dẫn các bạn sử dụng toán tử UNION để ghép hai hay nhiều kết quả từ các câu lệnh SELECT. Đây là tính năng khá hay và nó cũng có những điểm giống và khác nhau phép JOIN chúng ta sẽ tìm hiểu trong các bài tới. Từ đó bạn có thể đặt một cơ sở rằng nếu bạn có một bảng lưu trữ lượng dữ liệu quá lớn và MySQL không cho phép bạn lưu tiếp thì bạn có thể tách làm hai bảng. Trong quá trình truy vấn bạn có thể gộp thành một bảng duy nhất.

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.