WHERE filtert rijen vóór de uitvoering van groepering en aggregaties, dat wil zeggen, het bepaalt welke records in de groepering/aggregatie worden opgenomen. HAVING filtert groepen al na het toepassen van aggregatiefuncties.
Voorbeeld:
-- Verkrijg afdelingen met een totale salaris grotere dan 50000, exclusief vertrokken medewerkers SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;
Hier:
Kun je aggregatiefuncties gebruiken in WHERE?
Fout: men probeert te schrijven WHERE SUM(amount) > 100, maar dat kan niet — aggregatiefuncties worden SLECHTS in HAVING toegepast.
Voorbeeld (NIET goed):
SELECT customer_id, SUM(amount) FROM orders WHERE SUM(amount) > 100 GROUP BY customer_id -- FOUT: onjuist gebruik van SUM() in WHERE
Goed:
SELECT customer_id, SUM(amount) FROM orders GROUP BY customer_id HAVING SUM(amount) > 100;
Verhaal
CRM-ontwikkeling. Poging om klanten met meer dan 5 bestellingen te filteren via WHERE COUNT(order_id) > 5. De query werkte niet. Resultaat: het aantal klanten in het rapport was onjuist, omdat COUNT niet kan worden gebruikt in WHERE.
Verhaal
Businessanalyse. In plaats van inactieve producten in WHERE te filteren, gebruikten ze HAVING. Resultaat: aggregatie van "lege" groepen en trage SQL. Dit werd opgelost door de statusfilter naar WHERE te verplaatsen.
Verhaal
Complex rapport. HAVING zonder GROUP BY gebruikt voor het filteren van afzonderlijke rijen. In sommige databases leidt dit tot een fout, in andere tot onduidelijk gedrag. Conclusie: HAVING moet na de groepering komen en voor aggregatievoorwaarden worden gebruikt.