SQL WHERE Koşulunda NULL Kontrolü: IS NULL vs = NULL Hatası
# SQL WHERE Koşulunda NULL Kontrolü: IS NULL vs = NULL Hatası
SQL'de NULL değerleri kontrol ederken çoğu kişi hata yapar. Bir sütunda NULL olup olmadığını kontrol etmek istediğinde WHERE email = NULL yazarlar. Bu hiçbir zaman çalışmaz.
Neden? Çünkü SQL'de NULL, "bilinmeyen" anlamına gelir. Bilinmeyen bir şeyi eşitlik operatörüyle karşılaştıramazsın. = NULL her zaman yanlış sonuç döner.
NULL değerleri kontrol etmek için IS NULL veya IS NOT NULL kullanmalısın.
1WHERE sütun_adı IS NULL2WHERE sütun_adı IS NOT NULLBir müşteri tablosu var. Bazı müşterilerin telefon numarası boş (NULL).
Yanlış (çalışmaz):
1SELECT * FROM müşteriler WHERE telefon = NULL;2-- Sonuç: 0 satır (hiçbir şey bulamaz)Doğru (çalışır):
1SELECT * FROM müşteriler WHERE telefon IS NULL;2-- Sonuç: Telefon numarası olmayan tüm müşterilerÇıktı Örneği:
1id | ad | telefon21 | Ahmet | NULL33 | Zeynep | NULL45 | Fatih | NULLNULL olmayan değerleri bulmak için:
1SELECT * FROM müşteriler WHERE telefon IS NOT NULL;2-- Sonuç: Telefon numarası olan müşterilerÇıktı Örneği:
1id | ad | telefon22 | Mehmet | 555123456734 | Ayşe | 5559876543SQL'de NULL, bir değer değildir. "Bilinmeyen" veya "tanımsız" demektir. Matematiksel olarak:
- 5 = 5 TRUE
- 5 = NULL NULL (ne doğru ne yanlış)
- NULL = NULL NULL (hiçbir zaman TRUE değildir)
Bu yüzden WHERE koşulunda her zaman IS NULL kullanmalısın.
| İşlem | Doğru Syntax | Yanlış Syntax |
|-------|-------------|---------------|
| NULL olanları bul | IS NULL | = NULL |
| NULL olmayanları bul | IS NOT NULL |!= NULL |
Bu kuralı hatırlasan SQL'de NULL sorunlarından kurtulursun.
6 yorum
bu çok yaygın bir hata herkes buna takılıyor başta NULLun eşitlikle çalışmaması mantıklı
ben de bunu öğrenirken çok sinir oldum neden böyle yapıldığını anlamıyordum başta
aynen ya "bilinmeyen" diye düşününce de garip geliyor başta ama mantığı anladıktan sonra
hocam ben de şu an anladım aslında NULLu bilinmeyen olarak düşününce diğer her şey
evet mantık çıkınca işte rahatlatıyor başta neden böyle diye kızıyorsun ama sonra aslında
evet sonra fark ediyorsun ki SQL aslında doğru davranıyor bilinmeyeni bilinmeyen olarak tutmak daha mantıklı