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

Her şeyi solda tutmak: LEFT JOIN

Önceki dersteki INNER JOIN önemli bir yan etkiye sahiptir: eşleşmeyen satırlar çıkarılır. Bir çalışanın departmanı yoksa (department_id, NULL'dir), sonuçtan kaybolurlar.

Bazen istediğin budur. Ancak çoğu zaman öyle değildir: Bir İK raporunda departmanı olmayanlar da dahil olmak üzere tüm çalışanları görmek önemlidir, ve kim olduklarını biliyorum. LEFT JOIN bunun içindir (tam olarak, LEFT OUTER JOIN).

Nasıl çalışır?

SQL
SELECT columns
FROM   table_a
LEFT JOIN table_b ON table_a.x = table_b.y;

İngilizce okuyun: table_a satırının tüm satırlarını koruyun; her biri için deneyin table_b'dan bir satır ekleyin; eşleşme yoksa şuradaki sütunları doldurun: table_b ile NULL"_.

Anahtar kelime LEFT: "soldaki tablo" anlamına gelir, yani yazılı olan. FROM'dan sonra. Tüm satırları her zaman hayatta kalır.

SQL
-- All employees, including those without a department:
SELECT e.first_name,
       e.last_name,
       d.name AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

Veri kümemizde bu sorgu 10 satır (her biri bir çalışan) döndürür. Andrea department_id = NULL sahibi Costa, dipartimento = NULL ile görünüyor ortadan kaybolmak yerine.

"Eşleşme yok" satırlarını bulma

Çok yararlı bir sonuç: sütunun IS NULL ile filtrelenmesi sağdaki tabloda tam olarak eşleşme olmadan satırları bulacaksınız:

SQL
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE  d.id IS NULL;

Bu numara gerçek dünyada her zaman kullanılır: "beni bul emirleri olmadan müşteri", "incelemesi olmayan ürünler", "hiç giriş yapmamış kullanıcılar " içinde.

Deneyin

Egzersiz#sql.m3.l2.e1
Denemeler: 0Yükleniyor…

Atanmış bir departmanı olmayan çalışanların adını (adını) ve soyadını (soyadını) döndürün. Bir veya daha fazla satır, iki sütun.

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

WHERE'ı d.id IS NULL ile tamamlayın; LEFT JOIN'in eşleşen bir departman bulamadığı satırları istiyorsunuz.

3 denemeden sonra çözüm mevcut

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

Egzersiz#sql.m3.l2.e2
Denemeler: 0Yükleniyor…

Tüm departmanları (departmanlar.adı) listeleyin ve bunların yanında, çalışanı olmayan departmanlar da dahil olmak üzere çalışan sayısını listeleyin (bunlar için 0'ı gösterin). İpucu: departmanlardan başlayın ve çalışanlarla SOL BİRLEŞTİRME yapın, ardından GROUP BY + COUNT yapın.

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

Eşleşme olmadığında 0 saymak için COUNT(e.id) (COUNT(*) değil) kullanın: COUNT(*), NULL'lu LEFT JOIN satırı nedeniyle 1 sayar.

3 denemeden sonra çözüm mevcut