Chuyển đến nội dung chính
Mô-đun 5 · Bài học 3 trong tổng số 419/57 trong khóa học~10 min
Bài học theo mô-đun (3/4)

THAM GIA NGOÀI: tìm "khoảng trống"

Trong Mô-đun 3, bạn đã thấy LEFT JOIN: giữ tất cả hàng ở bên trái, ngay cả những hàng đó không có kết quả phù hợp ở bên phải (trở thành NULL). Trong chương này chúng tôi mở rộng bộ công cụ với RIGHT JOIN và FULL OUTER JOIN và chúng tôi tìm hiểu cách sử dụng chúng để tìm "lỗ hổng" trong dữ liệu: các hàng trong một bảng không có sự tương ứng trong cái kia.

Ba loại THAM GIA NGOÀI

SQL
A LEFT  JOIN B  ON …  -- tutte le righe di A, con o senza match in B
A RIGHT JOIN B  ON …  -- tutte le righe di B, con o senza match in A
A FULL  JOIN B  ON …  -- tutte le righe di A *e* di B; NULL dove non c'è match

A RIGHT JOIN B luôn có thể được viết lại thành B LEFT JOIN A giống nhau ON: vấn đề là khả năng đọc được. Nhiều phong cách (bao gồm cả khóa học này) luôn muốn sử dụng LEFT JOIN để đảm bảo tính nhất quán.

Mẫu "chống tham gia": tìm những cái còn thiếu

Cách sử dụng phổ biến nhất của LEFT JOIN không phải là "làm phong phú thêm dữ liệu trên bên phải", nhưng tìm các hàng ở bên trái KHÔNG khớp với đúng. Nó được gọi là anti-join:

SQL
-- Prodotti senza nessuna recensione:
SELECT p.id, p.name
FROM   products p
LEFT JOIN reviews r ON r.product_id = p.id
WHERE  r.id IS NULL
ORDER BY p.id;

Logic mẫu:

  1. LEFT JOIN đính kèm các đánh giá về từng sản phẩm, nếu có;
  2. đối với những sản phẩm không có đánh giá, tất cả các cột r đều là NULL;
  3. WHERE r.id IS NULL chỉ giữ những sản phẩm đó.

Kiểm tra khóa: id IS NULL trên cột NOT NULL của bảng bên phải có nghĩa là "không có sự trùng khớp". Bạn thường lọc theo PK bên tay phải table chính xác vì lý do này.

THAM GIA BÊN NGOÀI ĐẦY ĐỦ

FULL OUTER JOIN giữ cả hai bên mà không có trận đấu nào. Nó hiếm khi được sử dụng, thông thường để kiểm tra tính toàn vẹn dữ liệu:

SQL
SELECT c.id AS customer_id, o.id AS order_id
FROM   customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id
WHERE  c.id IS NULL OR o.id IS NULL;

Các hàng có c.id IS NULL sẽ là các đơn hàng mồ côi (một customer_id mà không tồn tại trong customers). Những người có o.id IS NULL là khách hàng không có mệnh lệnh. Trên tập dữ liệu của chúng tôi, khóa ngoại đảm bảo rằng không có khóa mồ côi nào đơn đặt hàng tồn tại; chỉ còn lại những khách hàng không có đơn đặt hàng.

Hãy tự mình thử

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

Trova tutti i prodotti che non hanno mai Ricevuto una recensione. Tên Mostra solo la Colonna. Ordina theo tên.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Mẫu chống tham gia: LEFT JOIN đánh giá su sản phẩm_id, poi WHERE r.id IS NULL.

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.l3.e2
Nỗ lực: 0Đang tải…

Trova i clienti che non hanno mai Ordinato nulla. Email của Mostra. Ordina mỗi email.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Stesso mô hình dell'esercizio tiền lệ, ma fra khách hàng và đơn đặt hàng.

Giải pháp khả dụng sau 3 lần thử