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

NULL'ları İşleme: IS NULL ve COALESCE

employees veri kümesinde Andrea Costa özeldir: department_id = NULL. Zaten NULL ile karşı karşıyaydınız (ile LEFT JOIN), ancak bunu ciddiye almanın zamanı geldi: SQL'de NULLs diğer değerlerden farklı davranırlar ve bunları görmezden gelmek Üretim kodundaki hataların başlıca nedenleri.

NULL sıfır değil, boş dize değil

NULL bilinmeyen/eksik değer anlamına gelir. 0 değil, '' değil, değil false. Bu "Bilmiyorum". Bundan şaşırtıcı bir özellik çıkıyor: NULL hiçbir şeye eşit değildir, hatta kendisine bile.

SQL
-- All these expressions return NULL (not true!):
SELECT NULL = NULL;       -- NULL
SELECT NULL = 0;          -- NULL
SELECT NULL <> 'qualcosa'; -- NULL

Somut sonuç: WHERE column = NULL asla işe yaramaz. Kullanmanız gerekir özel operatörler IS NULL / IS NOT NULL:

SQL
-- Employees without a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NULL;

-- Employees WITH a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NOT NULL;

COALESCE — NULL geri dönüşü

Veriler genellikle NULL yerine bir şeyi görüntülemek istersiniz. eksik: '(none)' dizesi, sıfır, varsayılan tarih. İşlev tam olarak bu COALESCE(a, b, c, ...) mü: ilk değeri döndürür listede NULL olmayan bağımsız değişken.

SQL
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM   employees;

LEFT JOIN ile birleştirildiğinde raporlar için inanılmaz derecede güçlü hale gelir:

SQL
SELECT e.first_name,
       e.last_name,
       COALESCE(d.name, '(nessun dipartimento)') AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

Sonuç: tüm çalışanlar departmanın adı veya açık bir şekilde geri döndü etiketi olmayanlar için.

NULL ve toplamalar

Toplama işlevleri yoksay NULLs (COUNT(*) hariç):

  • COUNT(department_id) yalnızca değeri olan satırları sayar;
  • AVG(salary) ortalamaları, NULLs'yi yok sayar — onları 0 olarak ** değerlendirmez**;
  • SUM(...) yalnızca NULL olmayan değerleri toplar.

Bu neredeyse her zaman istediğin şeydir. Ama şunu bilmek güzel: eğer "toplam çalışan sayısını" ararken COUNT(*) kullanın, değil COUNT(department_id).

Deneyin

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

Her çalışan için, adını (adını), soyadını (soyadı) ve departman_id'sine eşit olan bir 'dipartimento_id' sütununu veya atanmamışsa -1'i gösterin. Üç sütun, çalışan başına bir satır.

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

NULL'ları -1 ile değiştirmek için COALESCE(departman_id, -1) kullanın.

3 denemeden sonra çözüm mevcut

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

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

TÜM çalışanların adını (adını), soyadını (soyadını) ve departman adını (departments.name) döndürün; departman eksik olduğunda '(nessuno)' gösterilir. LEFT JOIN + COALESCE'i kullanın.

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

COALESCE(d.name, '(nessuno)'), LEFT JOIN tarafından tanıtılan NULL'u işler.

3 denemeden sonra çözüm mevcut