Ana içeriğe geç
Modül 5 · Ders 3 ders 4Kurstaki 19/57~10 min
Modül dersleri (3/4)

OUTER JOIN: "boşlukları" bulma

Modül 3'te LEFT JOIN gördünüz: tüm satırları solda tutun, bunlar dahil sağda eşleşme olmadan (NULL olur). Bu bölümde biz araç setini RIGHT JOIN ve FULL OUTER JOIN ile genişletin ve öğrenelim verilerdeki "delikleri" bulmak için bunları nasıl kullanabilirim: bir tablodaki satırlar diğerinde karşılığı yoktur.

Üç tür OUTER JOIN

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 her zaman aynı şekilde B LEFT JOIN A olarak yeniden yazılabilir. ON: bu bir okunabilirlik meselesidir. Birçok stil (bu kurs dahil) tutarlılık için her zaman LEFT JOIN kullanmayı tercih edin.

"Birleşmeyi önleme" modeli: eksik olanları bulma

LEFT JOIN'nin en yaygın kullanımı "verilerle zenginleştirmek" değildir. sağda", ancak solda eşleşmesi olmayan satırları bulun doğru. Buna anti-join denir:

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;

Desen mantığı:

  1. LEFT JOIN varsa her ürünün yorumlarını ekler;
  2. İncelemesi olmayan ürünler için tüm r sütunları NULL şeklindedir;
  3. WHERE r.id IS NULL yalnızca bu ürünleri saklar.

Anahtar kontrolü: sağdaki tablonun NOT NULL sütununda id IS NULL "eşleşme olmadı" anlamına gelir. Sık sık sağ taraftaki PK'yi filtrelersiniz tam da bu nedenle tablo.

TAM DIŞ BİRLEŞİM

FULL OUTER JOIN her iki tarafı da maçsız durumda tutuyor. Nadiren kullanılır, genellikle veri bütünlüğü kontrolleri için:

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.id IS NULL içeren satırlar yetim siparişler olacaktır (bir customer_id customers'de mevcut değil). o.id IS NULL sahibi olanlar müşteridir emir olmadan. Veri setimizde yabancı anahtarlar hiçbir yetim kalmayacağını garanti eder emirler var; sadece siparişi olmayan müşteriler kalıyor.

Kendin dene

Egzersiz#sql.m5.l3.e1
Denemeler: 0Yükleniyor…

Bir düzeltme yapmamak için bir şeyler yaptım ve yaptım. Mostra solo la koloni adı. İsim başına Ordina.

Düzenleyici yükleniyor…
İpucu göster

Desen anti-join: LEFT JOIN, ürün_id'sini inceler, poi r.id NULL'DUR.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m5.l3.e2
Denemeler: 0Yükleniyor…

Müşterilerimin hiçbirinin siparişi sıfır değil. Mostra e-postası. E-posta başına Ordina.

Düzenleyici yükleniyor…
İpucu göster

Müşteriler ve siparişler için önceden hazırlanmış bir örnek.

3 denemeden sonra çözüm mevcut