HAVING ist die SQL-Klausel, mit der man Gruppen nach der Aggregation filtert. Während WHERE einzelne Zeilen vor dem Gruppieren aussortiert, prüft HAVING Bedingungen auf die fertigen Gruppen und ihre Aggregatwerte — etwa „nur Kategorien mit mehr als fünf Artikeln“.
Warum HAVING nötig ist
Aggregatfunktionen wie COUNT(*) oder SUM(preis) dürfen in WHERE nicht verwendet werden: Wenn die Zeilen noch nicht gruppiert sind, gibt es noch keinen Aggregatwert, gegen den man prüfen könnte. Diese Aufgabe übernimmt HAVING:
SELECT kategorie, COUNT(*) AS anzahl
FROM artikel
GROUP BY kategorie
HAVING COUNT(*) > 5;
Das Ergebnis enthält nur Kategorien mit mehr als fünf Artikeln. Die Bedingung kann sich auf ein Aggregat, aber auch auf eine gruppierte Spalte beziehen.
WHERE und HAVING im Zusammenspiel
Beide Klauseln lassen sich kombinieren und wirken dann in der logischen Reihenfolge der Abfrage nacheinander: WHERE filtert zuerst die Einzelzeilen (etwa nur Artikel des Jahres 2026), danach fasst GROUP BY zusammen, und schließlich grenzt HAVING die Gruppen ein (etwa nur Kategorien über einem Umsatz-Mindestwert). Wer die Filter vertauscht, bekommt falsche Ergebnisse — eine Bedingung auf Einzelzeilen gehört nie in HAVING.
HAVING ohne GROUP BY
Ein HAVING ohne GROUP BY ist erlaubt: Dann behandelt die Datenbank die gesamte Ergebnismenge als eine einzige Gruppe. So lässt sich zum Beispiel prüfen, ob eine Tabelle überhaupt genug Datensätze enthält.
Einordnung
HAVING gehört zur GROUP BY-Auswertung, die mit Aggregatfunktionen arbeitet. Komplexe Auswertungen lassen sich mit CTEs (WITH-Klausel) oder Window Functions erweitern. Die wichtigsten SQL-Befehle im Überblick bietet die SQL-Schnellreferenz.