HAVING ve WHERE Karşılaştırması
Gruplamadan önceki ve sonraki filtrelemeyi, ayrıca toplulaştırmayı hangi yan tümcenin gördüğünü öğrenin.
HAVING ve WHERE Karşılaştırması, 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.
Karşınıza Çıkacak Soru
'WHERE ile HAVING arasındaki fark nedir?' en sık sorulan SQL mülakat sorularından biridir. Zayıf bir yanıt, 'HAVING toplulaştırmalar içindir' der. Güçlü bir yanıt, her yan tümcenin sorgu işlem hattında ne zaman çalıştığını açıklar.
Bütün mesele bu zamanlamadır: WHERE gruplamadan önce satırları filtreler; HAVING toplulaştırmadan sonra grupları filtreler.
Yürütme Sırasındaki Yerleri
Bir sorgunun mantıksal yürütme sırasını hatırlayın:
FROM/JOIN→ satır kümesini oluştururWHERE→ tek tek satırları filtrelerGROUP BY→ satırları gruplar hâlinde birleştirirHAVING→ grupları filtrelerSELECT→ sütunları seçerORDER BY→ sıralar
WHERE, gruplar oluşmadan önce çalışır; HAVING ise sonra çalışır. Bu nedenle HAVING toplulaştırmaları görebilir, WHERE göremez.
WHERE Toplulaştırmaları Göremez
WHERE gruplamadan önce çalıştığı için henüz toplulaştırılmış değerler mevcut değildir. WHERE COUNT(*) > 5 yazmak, tüm standart veritabanlarında bir sözdizimi hatasıdır.
Mülakat yapanlar, işlem hattını anlayıp anlamadığınızı kontrol etmek için tam olarak bu satırı kullanır. WHERE değerlendirildiğinde toplulaştırma henüz mevcut değildir.
-- ERROR: aggregate not allowed in WHERE
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;HAVING Grupları Filtreler
Toplulaştırma koşulunu HAVING'e taşıdığınızda çalışır; çünkü HAVING, gruplar ve bunların toplulaştırılmış değerleri hesaplandıktan sonra çalışır.
Bunu şöyle okuyun: 'Çalışanları gruplandır, sonra yalnızca sayısı beşi aşan departmanları tut.'
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Satır Filtrelerini WHERE İçine Koyun
Bunun tersi olan hata, ham satırları HAVING içinde filtrelemektir. Bu yöntem çoğu zaman doğru sonucu verir, ancak daha yavaş ve yanıltıcıdır; çünkü atmak istediğiniz satırları da gruplandırmış olursunuz.
Pratik kural: ham sütun değerine göre filtreliyorsanız → WHERE. Toplulaştırılmış bir değere göre filtreliyorsanız → HAVING. Satırları erken filtrelemek, gruplamanın işlemesi gereken veriyi küçültür.
-- Better: drop inactive rows BEFORE grouping
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5;Her İki Yan Tümceyi Birlikte Kullanma
Tam bir sorguda sıklıkla her ikisi de kullanılır. WHERE önce satırları daraltır; ardından HAVING koşulu karşılayan grupları tutar. Yukarıdan aşağıya okumak, mantıksal sırayla eşleşir.
Uygulamalı örnek: bu yıl verilen siparişler arasından toplamda 1000'den fazla harcama yapan müşterileri bulun.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING SUM(amount) > 1000;Toplulaştırılmamış Sütunlarda HAVING
HAVING yalnızca toplulaştırmaları değil, bir gruplama sütununu da kullanabilir. HAVING department = 'Sales' geçerlidir, ancak gereksizdir: bu filtre daha erken çalışması için WHERE içinde yer almalıdır.
Mülakat yapan kişi size düz bir gruplama sütununu filtreleyen bir HAVING gösterirse beklenen eleştiri şudur: 'Verimlilik için bunu WHERE içine taşıyın.'
-- Works but inefficient; prefer WHERE department = 'Sales'
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING department = 'Sales';GROUP BY Olmadan HAVING
İnce bir nokta: GROUP BY olmadan da HAVING kullanmak geçerlidir. Tablonun tamamı tek bir örtük grup hâline gelir ve HAVING bu tek grubu filtreler.
Toplulaştırma koşulu yanlışsa sıfır satır, doğruysa bir satır elde edersiniz. Nadiren kullanışlıdır, ancak mülakat yapanlar örtük grup kavramını anlayıp anlamadığınızı doğrulamak için bunu sorar.
-- Returns the count only if the table has > 100 rows
SELECT COUNT(*) AS total
FROM orders
HAVING COUNT(*) > 100;HAVING Bir SELECT Takma Adını Kullanabilir mi?
Başka yerlerdeki takma ad kapsamı sorusunda olduğu gibi, lehçeler farklı davranır. Postgres ve MySQL, HAVING içinde bir SELECT takma adına başvurmanıza izin verir; SQL Server ve Oracle izin vermez.
Taşınabilir yaklaşım, toplulaştırma ifadesini HAVING içinde tekrarlamaktır. Bu yaklaşım her motorla çalışır ve farklı veritabanlarını kapsayan bir mülakatta sürprizleri önler.
-- Portable: repeat the aggregate, do not rely on the alias
SELECT region, SUM(amount) AS total
FROM sales
GROUP BY region
HAVING SUM(amount) > 5000;Performans Açısından Çerçeveleme
Etkileyici olmak için yan tümceleri performansla ilişkilendirin: WHERE, gruplama motorunun taraması gereken satırları azaltır ve dizinleri kullanabilir; HAVING zaten toplulaştırılmış gruplar üzerinde çalıştığından gruplama maliyetini azaltamaz.
Mülakat yapanların duymak istediği sonuç şudur: her filtreyi mümkün olduğunca erken uygulayın. Yalnızca gerçekten bir toplulaştırmaya bağlı olan koşullar HAVING gerektirir.
Tek Cümlelik Yanıt
Mülakat için şunu ezberleyin: 'WHERE, gruplamadan önce satırları filtreler ve toplulaştırmaları göremez; HAVING, toplulaştırmadan sonra grupları filtreler ve bir toplulaştırılmış değeri sınayabilen tek yan tümcedir.'
Bunun ardından yürütme sırası listesini verirseniz eksiksiz ve deneyimli bir yanıt sunmuş olursunuz.
Hızlı Kontrol
Her koşulun hangi yan tümceye ait olduğuna karar verin.
Özet
WHERE: GROUP BY işleminden önce satırları filtreler; toplulaştırmalara izin verilmez. HAVING: toplulaştırmadan sonra grupları filtreler; toplulaştırma koşulunun geçerli olduğu tek yerdir.
- Hız ve dizin kullanımı için ham sütun filtrelerini WHERE içine koyun.
- HAVING, gruplandırılmış sütunlara başvurabilir, ancak basit filtreler için bunu kullanmamalıdır.
- HAVING, tüm tabloyu oluşturan örtük grupla GROUP BY olmadan da çalışır.
- Farklı SQL lehçelerinde güvenli kullanım için toplulaştırma ifadelerini HAVING içinde tekrarlayın.
Sıkça Sorulan Sorular
“HAVING ve WHERE Karşılaştırması” dersi ücretsiz mi?
Evet — “HAVING ve WHERE Karşılaştırması” 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.
“HAVING ve WHERE Karşılaştırması” dersinde ne öğreneceğim?
Gruplamadan önceki ve sonraki filtrelemeyi, ayrıca toplulaştırmayı hangi yan tümcenin gördüğünü öğ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.
“HAVING ve WHERE Karşılaştırması” 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
- SELECT Sütunları için GROUP BY Kuralı
- HAVING ve WHERE Karşılaştırması
- Birden Çok Sütun ve İfadeye Göre Gruplama
- Grupları Sayma ve Filtreleme