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.
Ö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'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;
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.