Hợp
Thuộc phần Kiến thức cơ bản trong hành trình SQL của Coddy. Bài học 48 trên 72.
Phép hợp khác với phép nối. Phép nối dùng điều kiện để kết hợp các bảng, còn phép hợp chỉ thêm bảng này vào bên dưới bảng kia. Để dùng UNION, ta viết:
SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2Cả hai câu lệnh select phải tuân theo các quy tắc sau:
- Số lượng trường phải bằng nhau
- Thứ tự rất quan trọng
- Các cột ở cùng vị trí phải chứa cùng loại dữ liệu (SQLite không kiểm tra kiểu dữ liệu của chúng)
Ví dụ, giả sử chúng ta có các bảng sau:
germany_people
| id | name |
| 1 | Lena |
| 2 | Leonie |
england_people
| id | name |
| 1 | George |
| 2 | Lena |
Vấn đề: Chúng ta muốn tạo một bảng lớn chứa tất cả tên hiện có.
SELECT name from germany_people
UNION
SELECT name from england_peopleKết quả:
| name |
| Lena |
| Leonie |
| George |
UNION chỉ trả về các giá trị không trùng lặp, còn UNION ALL trả về tất cả bản ghi như vốn có:
SELECT name from germany_people
UNION ALL
SELECT name from england_peopleKết quả:
| name |
| Lena |
| Leonie |
| George |
| Lena |
Bạn cũng có thể kết hợp UNION ALL với các hàm tổng hợp, GROUP BY và ORDER BY để tổng hợp dữ liệu từ nhiều bảng. Mẹo là đặt UNION ALL bên trong một truy vấn con, rồi áp dụng nhóm và sắp xếp lên truy vấn đó.
Ví dụ, giả sử chúng ta muốn đếm số lần mỗi tên xuất hiện trong cả hai bảng:
SELECT name, COUNT(*) AS total_count
FROM (
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people
) AS combined
GROUP BY name
ORDER BY total_count DESCKết quả:
| tên | total_count |
| Lena | 2 |
| Leonie | 1 |
| George | 1 |
Ở đây, dùng UNION ALL (không dùng UNION) để giữ lại các giá trị trùng lặp như Lena. Nếu không, chúng sẽ bị loại bỏ trước khi đếm. Truy vấn con gộp tất cả các hàng, sau đó GROUP BY + COUNT tổng hợp chúng. ORDER BY sắp xếp kết quả cuối cùng.
Thử thách
DễCác bảng và cột hiện có:
sales_2009:product_id,quantity_soldsales_2010:product_id,quantity_soldsales_2011:product_id,quantity_sold
Có 3 bảng doanh số.
Tính tổng doanh số của từng sản phẩm từ tất cả các bảng.
Kết quả cần có product_id và tổng doanh số.
Đặt tên cột này là total_sales.
Sắp xếp kết quả theo tổng doanh số giảm dần.
Tự làm thử
-- Gộp ba bảng thành một kết quả, giữ lại tất cả các hàng
SELECT product_id, ____ AS total_sales
FROM (
SELECT * FROM sales_2009
____
SELECT * FROM sales_2010
____
SELECT * FROM sales_2011
)
-- Mỗi sản phẩm một hàng, xếp tổng lớn nhất lên đầu
GROUP BY ____
ORDER BY ____ DESC;Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức cơ bản
2Điều kiện
Kiến thức cơ bản về điều kiệnTừ khóa ANDTừ khóa ORTừ khóa NOTKết hợp nhiều điều kiệnDấu ngoặc đơnGiá trị logic3Định dạng giá trị trả về cụ thể
Giá trị nullSắp xếp kết quả phần 1Sắp xếp kết quả phần 2Ôn tập: Công ty an ninh mạngGiới hạn số bản ghiÔn tập: Nhà máy sản xuất xe6Thử thách nhập môn
Ôn tập: bầu cử quốc hộiÔn tập: cảnh sát bắt giữ tội phạmÔn tập: vật chứa đồ uống tại quầy barÔn tập: kỹ sư tạo cột mớiTự luyện tập: Playground SQL