WHERE ile HAVING farkı
- WHERE, gruplamadan önce tek tek satırları süzer. İçinde toplama fonksiyonu kullanılamaz.
- HAVING, gruplamadan sonra grupları süzer. Toplama fonksiyonlarıyla çalışır.
-- 5'ten fazla ürünü olan kategoriler SELECT category, COUNT(*) AS urun_sayisi FROM products GROUP BY category HAVING COUNT(*) > 5;
İkisini birlikte kullanmak çok yaygındır:
-- Teslim edilmiş siparişlerde, 10'dan fazla siparişi olan müşteriler SELECT customer_id, COUNT(*) AS siparis FROM orders WHERE status = 'delivered' GROUP BY customer_id HAVING COUNT(*) > 10 ORDER BY siparis DESC;
PerformansSatır düzeyinde süzebileceğin her koşulu WHERE'e koy. HAVING'e sadece toplama sonucuna bağlı koşullar kalsın. Böylece veritabanı daha az satırı gruplar.
Derinleş: WHERE mi HAVING mi?
Karar kuralı basit: koşul tek bir satıra bakarak değerlendirilebiliyorsa WHERE, bir grubun özetine bakmayı gerektiriyorsa HAVING.
| Koşul | Yer |
|---|---|
| Durumu teslim olan siparişler | WHERE |
| 100'den fazla siparişi olan restoranlar | HAVING |
| Ortalama bahşişi 10 TL'yi aşan kuryeler | HAVING |
| Aralık siparişleri | WHERE |
SELECT courier_id, COUNT(*) AS siparis, ROUND(AVG(tip), 2) AS ort_bahsis FROM lk_orders WHERE status = 'teslim' GROUP BY courier_id HAVING AVG(tip) > 8 ORDER BY ort_bahsis DESC;