Chuyển đến nội dung chính
Mô-đun 5 · Bài học 4 trong tổng số 420/57 trong khóa học~12 min
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.

SQL
-- 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:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

Quy tắc:

  • hai SELECT phả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ả DISTINCT về kết quả cuối cùng;
  • UNION ALL cũ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.
SQL
-- 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”).

SQL
-- 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ử

tập thể dục#sql.m5.l4.e1
Nỗ lực: 0Đang tải…

Trova tutte le email dei clienti che hanno ordato qualcosa OPPURE recensito qualcosa (senza duplicati). Una Colonna: email. Ordina mỗi email.

Đang tải trình chỉnh sửa…
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

tập thể dục#sql.m5.l4.e2
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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ử