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.
-- All these expressions return NULL (not true!):
SELECT NULL = NULL; -- NULL
SELECT NULL = 0; -- NULL
SELECT NULL <> 'qualcosa'; -- NULLSomut sonuç: WHERE column = NULL asla işe yaramaz. Kullanmanız gerekir
özel operatörler IS NULL / IS NOT NULL:
-- 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.
-- 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:
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
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.
İ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
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.
İpucu göster
COALESCE(d.name, '(nessuno)'), LEFT JOIN tarafından tanıtılan NULL'u işler.
3 denemeden sonra çözüm mevcut