1) Chức năng của toán tử UNION, UNION ALL
– Trong hệ quản trị cơ sở dữ liệu MySQL, toán tử UNION và UNION ALL được dùng để gộp tập kết quả của hai hay nhiều câu lệnh truy vấn dữ liệu (SELECT) lại với nhau.
– Trong đó:
- Toán tử UNION chỉ lấy mỗi loại giá trị một lần duy nhất (tức là không có trường hợp các giá trị trùng nhau)
- Toán tử UNION ALL sẽ lấy hết tất cả các kết quả, mặc cho chúng có bị trùng nhau hay không.
2) Cách sử dụng toán tử UNION, UNION ALL
– Khi sử dụng toán tử UNION hoặc UNION ALL thì chúng ta cần phải tuân thủ các quy tắc như sau:
- Các câu lệnh SELECT phải có chung số lượng cột.
- Thứ tự cột trong các câu lệnh SELECT phải được sắp xếp theo đúng thứ tự cột của cái bảng kết hợp.
- Các cột tương ứng giữa các câu lệnh SELECT phải có kiểu dữ liệu giống nhau.
– Dưới đây là cú pháp sử dụng toán tử UNION:
SELECT column1, column2, column3, . . . . FROM table1 WHERE condition
UNION
SELECT column1, column2, column3, . . . . FROM table2 WHERE condition;
– Dưới đây là cú pháp sử dụng toán tử UNION ALL:
SELECT column1, column2, column3, . . . . FROM table1 WHERE condition
UNION ALL
SELECT column1, column2, column3, . . . . FROM table2 WHERE condition;
3) Tham khảo một số ví dụ
– Trong bài học này, tôi sẽ sử dụng hai cái bảng Customers & SinhVien như bên dưới để làm ví dụ minh họa.
CustomerID | CustomerName | Gender | Age | City |
1 | Nguyễn Thành Nhân | Nam | 22 | Cần Thơ |
2 | Nguyễn Thụy Tố Quyên | Nữ | 23 | Hậu Giang |
3 | Hồ Nguyễn Minh Thư | Nữ | 25 | Đồng Tháp |
4 | Trương Khắc Tâm | Nam | 20 | Cần Thơ |
MSSV | HoTen | GioiTinh | Tuoi | ThanhPho |
1 | Hồ Nguyễn Minh Thư | Nữ | 19 | An Giang |
2 | Nguyễn Thành Nhân | Nam | 20 | Trà Vinh |
3 | Phạm Khắc Việt | Nam | 18 | Cần Thơ |
– Gộp các khách hàng & sinh viên (sống tại Cần Thơ) vào chung một bảng.
– Lưu ý: Chỉ lấy các thông tin HỌ TÊN, TUỔI, THÀNH PHỐ
SELECT CustomerName, Age, City FROM Customers WHERE City = "Cần Thơ"
UNION ALL
SELECT HoTen, Tuoi, ThanhPho FROM SinhVien WHERE ThanhPho = "Cần Thơ";
– Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:
CustomerName | Age | City |
Nguyễn Thành Nhân | 22 | Cần Thơ |
Trương Khắc Tâm | 20 | Cần Thơ |
Phạm Khắc Việt | 18 | Cần Thơ |
– Khi chúng ta gộp kết quả từ hai hay nhiều câu lệnh truy vấn dữ liệu (SELECT) lại với nhau thì mặc định tên cột trên cái bảng kết hợp sẽ được lấy từ tên của các cột ở trong câu lệnh truy vấn thứ nhất (điển hình như trong ví dụ 1, tên của các cột là CustomerName, Age, City chứ không phải là HoTen, Tuoi, ThanhPho)
– Để thay đổi tên cột trên bảng kết hợp thì các bạn có thể sử dụng lệnh AS để đặt bí danh cho các cột.
– Ví dụ:
SELECT CustomerName AS C1, Age AS C2, City AS C3 FROM Customers WHERE City = "Cần Thơ"
UNION ALL
SELECT HoTen, Tuoi, ThanhPho FROM SinhVien WHERE ThanhPho = "Cần Thơ";
– Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:
C1 | C2 | C3 |
Nguyễn Thành Nhân | 22 | Cần Thơ |
Trương Khắc Tâm | 20 | Cần Thơ |
Phạm Khắc Việt | 18 | Cần Thơ |
– Gộp các khách hàng & sinh viên vào chung một bảng.
– Lưu ý: Chỉ lấy HỌ TÊN, TUỔI, THÀNH PHỐ, sắp xếp các kết quả theo thứ tự giảm dần dựa trên độ tuổi.
SELECT CustomerName AS HỌ_TÊN, Age AS TUỔI, City AS THÀNH_PHỐ FROM Customers
UNION ALL
SELECT HoTen, Tuoi, ThanhPho FROM SinhVien
ORDER BY TUỔI DESC;
– Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:
HỌ_TÊN | TUỔI | THÀNH_PHỐ |
Hồ Nguyễn Minh Thư | 25 | Đồng Tháp |
Nguyễn Thụy Tố Quyên | 23 | Hậu Giang |
Nguyễn Thành Nhân | 22 | Cần Thơ |
Trương Khắc Tâm | 20 | Cần Thơ |
Nguyễn Thành Nhân | 20 | Trà Vinh |
Hồ Nguyễn Minh Thư | 19 | An Giang |
Phạm Khắc Việt | 18 | Cần Thơ |
– Liệt kê tên của tất cả các khách hàng & sinh viên.
– Lưu ý: Họ tên trong cái bảng kết hợp không được phép trùng nhau.
SELECT CustomerName AS HỌ_TÊN FROM Customers
UNION
SELECT HoTen FROM SinhVien;
– Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:
HỌ_TÊN |
Nguyễn Thành Nhân |
Nguyễn Thụy Tố Quyên |
Hồ Nguyễn Minh Thư |
Trương Khắc Tâm |
Phạm Khắc Việt |
– Gộp các khách hàng & sinh viên vào chung một bảng.
– Lưu ý: Tạo thêm một cột PHÂN_LOẠI để cho biết đó là khách hàng hay sinh viên.
SELECT "Khách hàng" AS PHÂN_LOẠI,
CustomerName AS HỌ_TÊN,
Age AS TUỔI,
City AS THÀNH_PHỐ FROM Customers
UNION
SELECT "Sinh viên", HoTen, Tuoi, ThanhPho FROM SinhVien;
– Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như bên dưới:
PHÂN_LOẠI | HỌ_TÊN | TUỔI | THÀNH_PHỐ |
Khách hàng | Nguyễn Thành Nhân | 22 | Cần Thơ |
Khách hàng | Nguyễn Thụy Tố Quyên | 23 | Hậu Giang |
Khách hàng | Hồ Nguyễn Minh Thư | 25 | Đồng Tháp |
Khách hàng | Trương Khắc Tâm | 20 | Cần Thơ |
Sinh viên | Hồ Nguyễn Minh Thư | 19 | An Giang |
Sinh viên | Nguyễn Thành Nhân | 20 | Trà Vinh |
Sinh viên | Phạm Khắc Việt | 18 | Cần Thơ |