Toplulaştırmalarda, Birleştirmelerde ve DISTINCT içinde NULL Değerler
NULL değerinin gruplama, birleştirme ve benzersizlik işlemlerinde nasıl farklı davrandığını öğrenin.
Toplulaştırmalarda, Birleştirmelerde ve DISTINCT içinde NULL Değerler, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 4. 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, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.
NULL'ın Şaşırtıcı Davrandığı Üç Yer
NULL her yerde aynı şekilde davranmaz. Son derste, davranışının adayları en çok şaşırttığı üç bağlam ele alınır: toplama işlevleri, birleştirmeler ve DISTINCT / GROUP BY.
Tekrarlanan ayrıntı şudur: toplama işlevleri ve filtreleme NULL değerini “beni atla” olarak ele alırken gruplama ve DISTINCT, NULL değerini “diğer NULL değerlerine eşit bir değer” olarak ele alır. Mülakatı yapanların özellikle yokladığı tutarsızlık tam olarak budur.
Bunlarda ustalaştığınızda SQL mülakatlarındaki en yaygın NULL sorularını tamamıyla öğrenmiş olursunuz.
Toplama İşlevleri NULL Değerlerini Yok Sayar
Temel kural şudur: toplama işlevleri NULL değerlerini atlar. SUM, AVG, MIN, MAX ve COUNT(column), NULL girdilerini sıfır kabul etmek yerine tamamen yok sayar.
AVG'nin beklediğinizden farklı bir sayı döndürebilmesinin nedeni budur. Toplamı toplam satır sayısına değil, NULL olmayan değerlerin sayısına böler.
-- bonus values: 100, 200, NULL
SELECT
SUM(bonus) AS total, -- 300 (NULL ignored)
AVG(bonus) AS average, -- 150 = 300 / 2, not / 3
COUNT(bonus) AS cnt -- 2 (NULL not counted)
FROM employees;COUNT(*) ve COUNT(column)
Toplama işlevleri ve NULL konusunda en sık sorulan soru budur. COUNT(*), NULL içerenler de dâhil olmak üzere satırları sayar. COUNT(column) ise yalnızca ilgili sütunun NULL olmayan olduğu satırları sayar.
Dolayısıyla aralarındaki fark, tam olarak o sütundaki NULL değerlerinin sayısıdır. COUNT(DISTINCT column) bir adım daha ileri gider; yine NULL değerlerini yok sayar ve yinelenenleri kaldırır.
SELECT
COUNT(*) AS rows_total, -- all rows
COUNT(bonus) AS non_null_bonus, -- excludes NULLs
COUNT(DISTINCT bonus) AS distinct_bonus, -- excludes NULLs + dups
COUNT(*) - COUNT(bonus) AS null_bonus
FROM employees;AVG ve SUM/COUNT(*): Klasik Tuzak
Mülakatı yapanlar şunu sorar: “AVG(x), SUM(x) / COUNT(*) ile aynı mıdır?” NULL değerleri bulunduğunda yanıt hayırdır.
AVG(x), NULL olmayan değerlerin sayısına bölme yapan SUM(x) / COUNT(x) ifadesine eşittir. Bunun yerine COUNT(*) ile bölmek, NULL değerlerini sıfırmış gibi ele alır ve ortalamayı düşürür.
NULL değerlerinin gerçekten sıfır olarak sayılmasını istiyorsanız bunu COALESCE ile açıkça belirtmeniz gerekir.
-- These differ when bonus has NULLs:
SELECT
AVG(bonus) AS avg_ignoring_nulls,
SUM(bonus) * 1.0 / COUNT(*) AS avg_nulls_as_zero,
AVG(COALESCE(bonus, 0)) AS explicit_nulls_as_zero
FROM employees;Tümü NULL Olan Toplama Sonucu Uç Durumu
Her girdi NULL olduğunda veya hiç satır bulunmadığında bir toplama işlevi ne döndürür? Mülakatı yapanların sevdiği kesin ayrım şöyledir:
- Tümü NULL olan (veya sıfır) satırlar üzerindeki
SUM,AVG,MINveMAXişlemleri NULL döndürür. COUNTher zaman 0 döndürür, hiçbir zaman NULL döndürmez.
Bu nedenle bir raporda toplamlar boş görünüyorsa, olası nedenlerden biri tüm değerleri NULL olan bir SUM işlemidir. 0 göstermek için onu COALESCE ile sarın.
-- No matching rows or all bonuses NULL:
SELECT SUM(bonus) FROM employees WHERE 1 = 0; -- NULL
SELECT COUNT(bonus) FROM employees WHERE 1 = 0; -- 0
-- Present a clean zero:
SELECT COALESCE(SUM(bonus), 0) FROM employees;JOIN Koşullarında NULL
Bir birleştirmenin ON yan tümcesinde NULL = NULL yine UNKNOWN olur; bu nedenle eşitlik birleştirmesinde NULL anahtarları asla eşleşmez. Birleştirme anahtarı NULL olan iki satır eşleştirilmez.
Bu durum, isteğe bağlı yabancı anahtarlarla birleştirme yapanları zor durumda bırakır. NULL ile NULL eşleşmesi amaçlanan davranışsa, önceki derste anlatılan bir NULL güvenli işlece (IS NOT DISTINCT FROM veya <=>) ihtiyacınız vardır.
-- Rows with region IS NULL on both sides do NOT match
SELECT *
FROM a JOIN b ON a.region = b.region;
-- To match NULL-to-NULL (ANSI):
SELECT *
FROM a JOIN b ON a.region IS NOT DISTINCT FROM b.region;Dış Birleştirmelerin Ürettiği NULL Değerleri
Dış birleştirmeler eşleşmeyen satırlar için NULL değerleri üretir. Bir LEFT JOIN sonrasında, eşleşme bulamayan sol taraftaki satırlarda sağ taraftaki her sütun NULL olur.
Bu, karşıt birleştirme kalıbının temelidir: siparişi olmayan müşteriler gibi eşleşmesi bulunmayan satırları bulmak için WHERE right_table.key IS NULL koşuluyla filtreleme yapın.
Ancak dikkatli olun: dış birleştirmeyle alınan bir sütunu WHERE içinde filtrelemek, bir sonraki bölümde ele alınan konuyla ilişkili olarak, birleştirmeyi yanlışlıkla yeniden iç birleştirmeye dönüştürebilir.
-- Find customers who have never ordered (anti-join)
SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;Dış Birleştirmede WHERE Üzerinden NULL Tuzağı
Sık karşılaşılan bir ince tuzak. Siparişleri LEFT JOIN ile birleştirip ardından WHERE o.status = 'shipped' koşulunu eklersiniz. Birden siparişi olmayan müşteriler kaybolur ve dış birleştirmeniz fiilen iç birleştirmeye dönüşür.
Neden? Eşleşmeyen satırlarda o.status NULL'dır ve NULL = 'shipped' UNKNOWN olduğu için WHERE bu satırları eler. Eşleşmeyen satırları korumak için koşulu bunun yerine ON yan tümcesine taşıyın.
-- Accidental inner join: drops customers with no orders
SELECT c.name, o.status
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'shipped';
-- Correct: keep unmatched customers
SELECT c.name, o.status
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id AND o.status = 'shipped';DISTINCT Tüm NULL Değerlerini Eşit Kabul Eder
İşte herkesi şaşırtan tutarsızlık. Toplama işlevleri NULL değerlerini atlar, ancak DISTINCT tam olarak bir NULL değerini korur; tüm NULL değerlerini birbirinin kopyası kabul eder.
Dolayısıyla 100, 100, NULL, NULL değerleri üzerinde SELECT DISTINCT bonus çalıştırıldığında üç satır döner: 100, NULL ve hepsi bu. NULL = NULL başka yerlerde UNKNOWN olarak değerlendirilse de iki NULL tek bir değerde birleşir.
-- bonus: 100, 100, NULL, NULL, 200
SELECT DISTINCT bonus FROM employees;
-- Returns: 100, 200, NULL (the two NULLs become one row)GROUP BY Tüm NULL Değerlerini Tek Bir Grupta Birleştirir
GROUP BY, DISTINCT ile aynı kuralı izler: tüm NULL anahtarları tek bir grupta toplanır. NULL değerlerinin hiçbir zaman birbirine eşit olmadığı karşılaştırma mantığının tam tersi bir durumdur.
Dolayısıyla NULL kabul edebilen bir sütuna göre gruplama yaptığınızda, NULL anahtarına sahip tüm kayıtları temsil eden tek bir satır elde edersiniz. Raporlama için genellikle istediğiniz sonuç budur. Derinlemesine kavrayışınızı göstermek için bu karşıtlıktan (gruplama ile karşılaştırma arasındaki farktan) söz edin.
-- All employees with NULL department form ONE group
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;
-- A single row where department is NULL totals all of themMülakatta Öne Çıkarılacak Noktalar
Mülakatçıları etkileyen birleştirici özet:
- Toplama işlevleri NULL değerlerini yok sayar; AVG, COUNT(*) yerine COUNT(column) ile böler.
- COUNT(*) satırları sayar; COUNT(col) ve COUNT(DISTINCT col) NULL değerlerini atlar.
- Hiç satır olmadığında SUM/AVG/MIN/MAX sonucu NULL, COUNT sonucu ise 0 olur.
- Birleştirmelerde NULL anahtarları hiçbir zaman eşleşmez; dış birleşimle birleştirilen bir sütunu WHERE içinde filtrelemek, fark ettirmeden iç birleşime dönüşür.
- DISTINCT ve GROUP BY tüm NULL değerlerini eşit kabul eder; bu, karşılaştırma mantığının tersidir.
Tek cümlelik özet: 'NULL, toplama ve karşılaştırma sırasında yok sayılır; ancak tekilleştirme sırasında birlikte gruplanır.'
Hızlı Kontrol
Gruplama ile toplama arasındaki farkı sınayın.
Özet
Mülakatlar için NULL işleme konusunu tamamladınız:
- Toplama işlevleri NULL değerlerini atlar; AVG, NULL olmayan değerlerin sayısına böler. Tüm değerleri NULL olan bir SUM sonucu NULL, COUNT sonucu ise 0 olur.
COUNT(*)NULL içeren satırları da sayar;COUNT(col)saymaz. Aradaki fark NULL sayısına eşittir.- NULL olan birleştirme anahtarları hiçbir zaman eşleşmez; dış birleşimle birleştirilen sütunları WHERE içinde filtrelemek, sonucu iç birleşime dönüştürebilir.
- DISTINCT ve GROUP BY tüm NULL değerlerini tek bir grupta birleştirir; bu, karşılaştırma mantığının tersidir.
Şu temel cümleyi hatırlayın: NULL, toplama ve karşılaştırma sırasında yok sayılır; ancak tekilleştirme sırasında birlikte gruplanır. Bu tek çıkarım, NULL hakkındaki mülakat sorularının çoğunu yanıtlamanızı sağlar.
Sıkça Sorulan Sorular
“Toplulaştırmalarda, Birleştirmelerde ve DISTINCT içinde NULL Değerler” dersi ücretsiz mi?
Evet — “Toplulaştırmalarda, Birleştirmelerde ve DISTINCT içinde NULL Değerler” 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 SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.
“Toplulaştırmalarda, Birleştirmelerde ve DISTINCT içinde NULL Değerler” dersinde ne öğreneceğim?
NULL değerinin gruplama, birleştirme ve benzersizlik işlemlerinde nasıl farklı davrandığını öğrenin. SQL 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.
SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL 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 4. dersidir.
“Toplulaştırmalarda, Birleştirmelerde ve DISTINCT içinde NULL Değerler” 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 SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL 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