ProgramlamaSQL analisti

SQL'de HAVING ve WHERE arasındaki farkları açıklayın. Her birinin amacı nedir, agregat fonksiyonlarla nasıl etkileşir ve kullanılmalarında sık karşılaşılan hatalardan nasıl kaçınılır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

WHERE satırları gruplama ve toplamadan önce filtreler, yani hangi kayıtların gruplamaya/toplamaya dahil olacağını belirler. HAVING ise agregat fonksiyonlar uygulandıktan sonra grupları filtreler.

  • WHERE: agregat fonksiyonlar (SUM, AVG vb.) kullanılamaz, çünkü filtreleme GRUPLAMADAN ÖNCE gerçekleşir.
  • HAVING: agregat fonksiyonlar kullanılabilir, çünkü filtreleme GRUPLAMADAN SONRA gerçekleştirilir.

Örnek:

-- Aktif durumdaki çalışanların toplam maaşının 50000'den fazla olduğu departmanları getirin SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;

Burada:

  • WHERE status = 'active' — emekli olanları departman toplamı hesaplamadan önce çıkarır;
  • HAVING SUM(salary) > 50000 — toplam maaşı 50000'i aşan departmanları gösterir.

Zor bir soru

WHERE'de agregat fonksiyonlar kullanılabilir mi?

Hata: WHERE SUM(amount) > 100 yazmaya çalışıyorlar, ama bu mümkün değil — agregat fonksiyonları SADECE HAVING'de kullanılır.

Örnek (YANLIŞ):

SELECT customer_id, SUM(amount) FROM orders WHERE SUM(amount) > 100 GROUP BY customer_id -- HATA: WHERE'de SUM()'in yanlış kullanımı

Doğru:

SELECT customer_id, SUM(amount) FROM orders GROUP BY customer_id HAVING SUM(amount) > 100;

Bu konunun inceliklerini bilmemekten kaynaklanan gerçek hatalardan örnekler


Hikaye

CRM geliştirme. Müşterileri WHERE COUNT(order_id) > 5 ile filtreleme girişimi. Sorgu çalışmadı. Sonuç: rapordaki müşteri sayısı hatalı, çünkü COUNT WHERE'de kullanılamaz.


Hikaye

İş analitiği. Aktif olmayan ürünleri filtrelemek için WHERE yerine HAVING kullanıldı. Sonuç: "boş" grupların agregasyonu ve yavaş SQL. Durum filtrelemesi WHERE'ye taşınarak düzeltildi.


Hikaye

Karmaşık rapor. Belirli satırları filtrelemek için GROUP BY olmadan HAVING kullanıldı. Bazı DBMS'lerde bu hata verir, diğerlerinde — belirsiz davranış sergileme. Sonuç: HAVING, gruplamadan sonra ve agregat koşulları için kullanılmalıdır.