WHERE filtert die Zeilen vor der Gruppierung und Aggregation, bestimmt also, welche Datensätze in die Gruppierung/Aggregation gelangen. HAVING filtert Gruppen bereits nach der Anwendung von Aggregatfunktionen.
Beispiel:
-- Abteilungen mit einer Gesamtgehalt von über 50000, Ausschluss von entlassenen Mitarbeitern abrufen SELECT department, SUM(salary) as total FROM employees WHERE status = 'active' GROUP BY department HAVING SUM(salary) > 50000;
Hier:
Kann man Aggregatfunktionen in WHERE verwenden?
Fehler: es wird versucht zu schreiben WHERE SUM(amount) > 100, das ist jedoch nicht möglich – Aggregatfunktionen kommen NUR in HAVING zum Einsatz.
Beispiel (FALSCH):
SELECT customer_id, SUM(amount) FROM orders WHERE SUM(amount) > 100 GROUP BY customer_id -- FEHLER: falsche Verwendung von SUM() in WHERE
Richtig:
SELECT customer_id, SUM(amount) FROM orders GROUP BY customer_id HAVING SUM(amount) > 100;
Geschichte
CRM-Entwicklung. Versuch, Kunden mit mehr als 5 Bestellungen über WHERE COUNT(order_id) > 5 zu filtern. Die Abfrage funktionierte nicht. Ergebnis: die Anzahl der Kunden im Bericht war inkorrekt, da COUNT nicht in WHERE verwendet werden kann.
Geschichte
Business-Analyse. Anstelle der Filterung inaktiver Produkte in WHERE wurde HAVING verwendet. Ergebnis: Aggregation "leerer" Gruppen und langsames SQL. Korrigiert wurde durch das Verschieben des Statusfilters nach WHERE.
Geschichte
Komplexer Bericht. HAVING wurde ohne GROUP BY zur Filterung einzelner Zeilen verwendet. In einigen DBMS führt dies zu einem Fehler, in anderen zu unvorhersehbarem Verhalten. Fazit: HAVING sollte nach der Gruppierung stehen und für Aggregatbedingungen verwendet werden.