Bài học theo mô-đun (4/4)
UNION, INTERSECT, NGOẠI TRỪ (và THAM GIA CROSS)
Cho đến nay bạn đã kết hợp dữ liệu theo chiều ngang: JOIN đính kèm các cột
từ các hàng liên quan. SQL cũng cung cấp một nhóm toán tử khác
kết hợp dữ liệu theo chiều dọc, coi kết quả của hai SELECT là
bộ: UNION, INTERSECT, EXCEPT. Chúng tôi cũng xem lại CROSS JOIN,
sản phẩm Descartes.
CROSS THAM GIA: mỗi hàng với mỗi hàng
CROSS JOIN không có ON: nó tạo ra mọi kết hợp có thể của
các hàng giữa hai bảng (tích Descartes). Nếu A có n hàng và B
có m hàng thì kết quả có n × m.
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM customers c
CROSS JOIN products p;12 khách hàng × 16 sản phẩm = 192 hàng. Nó hiếm khi được sử dụng trên dữ liệu thực (nó đắt tiền!), nhưng nó hữu ích cho:
- tạo ra các kết hợp "tất cả chống lại tất cả" (ví dụ: ma trận tương thích);
- ghép một bảng với một bảng nhỏ các hằng số/tham số.
ĐOÀN và ĐOÀN TẤT CẢ
UNION nối kết quả của hai SELECT với cùng một số và
loại cột:
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';Quy tắc:
- hai
SELECTphải có cùng số cột, tương thích các loại; UNION(không cóALL) xóa các bản sao — thực hiện một cách hiệu quảDISTINCTvề kết quả cuối cùng;UNION ALLcũng giữ các bản sao và nhanh hơn nhiều vì nó tránh việc sắp xếp/băm để loại bỏ trùng lặp.
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM customers c JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.email
FROM customers c JOIN reviews r ON r.customer_id = c.id;GIAO NHẬN VÀ NGOẠI TRỪ
INTERSECT giữ chỉ các hàng có trong cả hai kết quả; EXCEPT
giữ các hàng của hàng đầu tiên không nằm trong hàng thứ hai (tập hợp
“sự khác biệt”).
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;
-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;INTERSECT và EXCEPT cũng xóa các mục trùng lặp theo mặc định; cái
Các biến thể INTERSECT ALL / EXCEPT ALL thì không.
Hãy tự mình thử
Trova tutte le email dei clienti che hanno ordato qualcosa OPPURE recensito qualcosa (senza duplicati). Una Colonna: email. Ordina mỗi email.
Hiển thị gợi ý
UNION giữa hai CHỌN trả về cùng một cột email. ORDER BY nằm ở cuối, trên kết quả cuối cùng.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Trova le email dei clienti che hanno ordato ma non hanno mai recensito nulla. Hoa Kỳ NGOẠI TRỪ. Una Colonna: email. Ordina mỗi email.
Hiển thị gợi ý
NGOẠI TRỪ chỉ giữ các hàng từ CHỌN bên trái không có ở hàng bên phải.
Giải pháp khả dụng sau 3 lần thử