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?
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.
-- 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:
-- 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
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.
İ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
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.
İ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