IS NULL, IS NOT NULL ve NULL Güvenli Eşitlik
NULL değerlerini doğru şekilde test etmeyi ve lehçeye göre NULL güvenli işleçleri öğrenin.
IS NULL, IS NOT NULL ve NULL Güvenli Eşitlik, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.
NULL’u Doğru Şekilde Sınama
Önceki ders, NULL’ları bulmak için = kullanamayacağınızı kanıtladı. Peki onları gerçekten nasıl sınarsınız? Özel koşullar olan IS NULL ve IS NOT NULL ile.
Bunlar eksik değerleri denetlemenin doğru ve taşınabilir tek yoludur; mülakat yapanlar col = NULL ifadesini her gördüklerinde reddeder.
Bu derste IS NULL, IS NOT NULL, IS DISTINCT FROM ailesi ve lehçeye özgü NULL güvenli eşitlik operatörleri ele alınır. Veritabanları arasındaki farkları bilmek, ileri düzey bilgi sahibi olduğunuzu gösterir.
IS NULL ve IS NOT NULL
IS NULL, değer NULL olduğunda TRUE, aksi durumda FALSE döndürür. En önemlisi, hiçbir zaman UNKNOWN döndürmez; bu nedenle doğrudan WHERE içinde kullanmak güvenlidir.
IS NOT NULL bunun tam tersidir: gerçek bir değer için TRUE, NULL için FALSE döndürür.
Bu koşullar NULL işlemenin temel araçlarıdır. Bunlar standart SQL’dir ve MySQL, Postgres, SQL Server, Oracle ve SQLite üzerinde aynı şekilde çalışır.
-- Find employees with no recorded bonus
SELECT name FROM employees WHERE bonus IS NULL;
-- Find employees that do have a bonus
SELECT name FROM employees WHERE bonus IS NOT NULL;col = NULL Neden Her Zaman Yanlıştır
Mülakatlarda kesin çıkan bir tuzak: Bir aday, eksik bonusları bulacağını düşünerek WHERE bonus = NULL yazar. Bu ifade sıfır satır döndürür.
Üç değerli mantığı hatırlayın: NULL olanlar da dahil olmak üzere her satır için bonus = NULL UNKNOWN’dur; çünkü hiçbir şey bilinmeyene eşit değildir. WHERE yalnızca TRUE olanları tuttuğu için hiçbir satır eşleşmez.
Standart dışı modlarda çalışan bazı veritabanları = NULL ifadesini sessizce IS NULL olarak yeniden yazabilir; ancak buna asla güvenmemelisiniz. Her zaman açıkça IS NULL yazın.
-- WRONG: returns zero rows, bonus = NULL is UNKNOWN for all
SELECT name FROM employees WHERE bonus = NULL;
-- RIGHT:
SELECT name FROM employees WHERE bonus IS NULL;NULL Olanları ve NULL Olmayanları Sayma
Yaygın bir analist görevi veri kalitesini denetlemektir: bir sütun ne kadar eksiksiz? Eksik değerleri raporlamak için IS NULL ile COUNT’u birleştirin.
Aradaki farka dikkat edin: COUNT(*) her satırı sayarken COUNT(bonus) yalnızca NULL olmayan bonusları sayar. İkisi arasındaki fark NULL sayısına eşittir; toplulaştırmalar dersinde bu konuya yeniden döneceğiz.
SELECT
COUNT(*) AS total_rows,
COUNT(bonus) AS with_bonus,
COUNT(*) - COUNT(bonus) AS missing_bonus,
SUM(CASE WHEN bonus IS NULL THEN 1 ELSE 0 END) AS missing_check
FROM employees;NULL Güvenli Eşitliğin Çözdüğü Sorun
İki sütunu eşleştirmek ve “ikisi de NULL” durumunu eşleşme saymak istediğinizi varsayalım. Düz a = b bunu başaramaz: ikisi de NULL olduğunda sonuç UNKNOWN olur; dolayısıyla sezgisel olarak “aynı” olsalar bile çift dışarıda bırakılır.
Bu durum, değişiklikleri saptamak için eski satırı yeni satırla karşılaştırırken veya isteğe bağlı sütunlarla birleştirme yaparken karşınıza çıkar. NULL’un NULL’a eşit olmasının TRUE ve NULL’un bir değere karşı FALSE olmasının gerektiği bir karşılaştırmaya ihtiyacınız vardır. NULL güvenli eşitlik bunu sağlar.
-- Goal: change-detection where two NULLs count as equal
-- Plain equality fails when both sides are NULL:
-- NULL = NULL -> UNKNOWN (treated as not-equal)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note = n.note; -- misses rows where both notes are NULLIS DISTINCT FROM (Standart SQL)
ANSI standartlı NULL güvenli karşılaştırma IS DISTINCT FROM ve bunun tersi olan IS NOT DISTINCT FROM ifadeleridir. Bunlar Postgres, SQL Server (2022 ve sonrası) ve diğerlerinde desteklenir.
a IS NOT DISTINCT FROM b, “eşit; NULL = NULL durumu da eşit kabul edilir” anlamına gelir.a IS DISTINCT FROM b, NULL’u normal bir değer gibi ele alarak “farklı” anlamına gelir.
Bunlar her zaman TRUE veya FALSE döndürür, hiçbir zaman UNKNOWN döndürmez; bu nedenle bir koşulun beklendiği her yerde güvenle kullanılabilir.
-- TRUE when notes match, including both NULL
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS NOT DISTINCT FROM n.note;
-- TRUE when notes differ (NULL vs value counts as different)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS DISTINCT FROM n.note;MySQL’in <=> Operatörü
MySQL, <=> (uzay gemisi operatörü) olarak yazılan kısa bir NULL güvenli eşitlik operatörü sunar.
a <=> b, her iki taraf eşitse veya ikisi de NULL ise 1 (TRUE), aksi durumda 0 (FALSE) döndürür. Bu, MySQL’de IS NOT DISTINCT FROM karşılığıdır.
Bir mülakat yapan kişi özellikle MySQL’de NULL güvenli eşleştirme isterse, yerleşik yanıt budur.
-- MySQL: 1 when both equal or both NULL
SELECT (NULL <=> NULL) AS both_null, -- 1
(NULL <=> 5) AS null_vs_val, -- 0
(5 <=> 5) AS val_eq; -- 1
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note <=> n.note;Diyalektler Arası Hızlı Başvuru
Mülakatı yapanlar, taşınabilirlik sınırlarını bilen adaylara değer verir. NULL güvenli eşitlik eşlemesi şöyledir:
- ANSI / Postgres / SQL Server 2022+:
IS NOT DISTINCT FROM - MySQL / MariaDB:
<=> - SQLite:
ISveIS NOT, NULL güvenli eşitlik olarak çalışır - Oracle: yerel bir işleç yoktur;
DECODE(a, b, 1, 0) = 1veya COALESCE hileleriyle taklit edilebilir
Motor konusunda emin değilseniz, sonraki bölümde gösterilen taşınabilir elle yazılmış biçime başvurun.
-- SQLite NULL-safe equality
SELECT * FROM t WHERE a IS b; -- TRUE when both NULL
SELECT * FROM t WHERE a IS NOT b; -- complementTaşınabilir Elle Yazılmış NULL Güvenli Eşleşme
Yerel bir işleç bulunmadığında, temel yapı taşlarından NULL güvenli eşitlik oluşturabilirsiniz. Taşınabilir kalıp, normal bir eşitliği her ikisinin de NULL olduğu açık bir koşulla birleştirir.
Şöyle okuyun: “eşittirler, OR ikisi de eksiktir.” Bu, her veritabanında çalıştığı için mülakatı yapan kişi bir SQL diyalekti belirtmediğinde harika bir yanıttır.
SELECT *
FROM old_t o JOIN new_t n ON o.id = n.id
WHERE (o.note = n.note)
OR (o.note IS NULL AND n.note IS NULL);
-- Alternative using COALESCE with a sentinel that
-- cannot occur in real data:
-- WHERE COALESCE(o.note, '##NULL##') = COALESCE(n.note, '##NULL##')Daha Derin Bir Örnek: NULL Güvenli JOIN Anahtarları
Gerçekçi bir tuzak: NULL olabilen bir anahtarla birleştirme yapmak. region her iki tarafta da NULL olabiliyorsa, normal bir eşitlik birleştirmesi NULL = NULL ifadesi UNKNOWN olduğu için bu çiftleri sessizce eler.
İş kuralı “bölgesi olmayan satırlar yine bölgesi olmayan diğer satırlarla eşleşmeli” ise birleştirme koşulunu NULL güvenli hâle getirmeniz gerekir. Mülakatta varsayımı açıkça belirtin, ardından motorla uyumlu işleci seçin.
-- Postgres / ANSI: match including both-NULL regions
SELECT a.id, b.id
FROM table_a a
JOIN table_b b
ON a.region IS NOT DISTINCT FROM b.region;
-- MySQL equivalent: ON a.region <=> b.regionMülakatta Vurgulanacak Noktalar
Her NULL sınama sorusunu temiz bir şekilde yanıtlamak için:
- Her zaman
IS NULL/IS NOT NULLkullanın; hiçbir zaman= NULLkullanmayın. - Bu koşullar yalnızca TRUE veya FALSE döndürür, dolayısıyla WHERE içinde güvenlidir.
- “NULL, NULL’a eşittir” eşleştirmesi için IS NOT DISTINCT FROM (ANSI) veya <=> (MySQL) kullanın.
- Hangi diyalekti hedeflediğinizi belirtin; emin değilseniz taşınabilir OR koşulunu yedek seçenek olarak sunun.
Hem standart işleci hem de üreticiye özgü işleci adlandırmanız, ön eleme yapanların fark edeceği genişliği gösterir.
Hızlı Kontrol
Doğru NULL güvenli karşılaştırmayı seçin.
Özet
Artık NULL değerini doğru şekilde sınayabilirsiniz:
IS NULL/IS NOT NULL, doğru ve taşınabilir tek NULL sınamalarıdır; hiçbir zaman UNKNOWN döndürmezler.col = NULLher zaman sıfır satır döndürür; bu, mülakatlarda sık kullanılan klasik bir tuzaktır.- NULL güvenli eşitlik, iki NULL değerini eşit kabul eder: IS NOT DISTINCT FROM (ANSI/Postgres), <=> (MySQL), IS (SQLite).
- İşleç yoksa
(a = b) OR (a IS NULL AND b IS NULL)kullanın.
Sıradaki konu: COALESCE, NULLIF ve ISNULL gibi üretici işlevleriyle NULL yerine varsayılan değerler koymak.
Sıkça Sorulan Sorular
“IS NULL, IS NOT NULL ve NULL Güvenli Eşitlik” dersi ücretsiz mi?
Evet — “IS NULL, IS NOT NULL ve NULL Güvenli Eşitlik” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.
“IS NULL, IS NOT NULL ve NULL Güvenli Eşitlik” dersinde ne öğreneceğim?
NULL değerlerini doğru şekilde test etmeyi ve lehçeye göre NULL güvenli işleçleri öğrenin. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“IS NULL, IS NOT NULL ve NULL Güvenli Eşitlik” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Üç Değerli Mantık ve UNKNOWN
- IS NULL, IS NOT NULL ve NULL Güvenli Eşitlik
- COALESCE, NULLIF ve ISNULL
- Toplulaştırmalarda, Birleştirmelerde ve DISTINCT içinde NULL Değerler