HAVING
Aggregatfunktionen
HAVING filtert Gruppen nach einer Bedingung – und zwar auf Basis von Aggregatwerten. Es ist das Gegenstück zu WHERE, greift aber erst nach der Gruppierung. Damit beantwortest du Fragen wie „Welche Städte haben mehr als drei Kunden?“.
Syntax
SELECT Gruppenspalte, Aggregat(...) FROM Tabelle GROUP BY Gruppenspalte HAVING Bedingung_auf_Aggregat;
Beispiel: Städte mit mehr als einem Kunden
SELECT Stadt, COUNT(*) AS Anzahl FROM Kunden GROUP BY Stadt HAVING COUNT(*) > 1;
| Stadt | Anzahl |
|---|---|
| Berlin | 2 |
| Hamburg | 2 |
Köln mit nur einem Kunden fällt heraus, weil seine Gruppe die Bedingung nicht erfüllt.
HAVING vs. WHERE – der zentrale Unterschied
WHEREfiltert einzelne Zeilen vor der Gruppierung und kann keine Aggregatfunktionen nutzen.HAVINGfiltert fertige Gruppen nach der Gruppierung und ist genau für Aggregate gedacht.
Oft setzt du beide zusammen ein: erst grob mit WHERE vorfiltern, dann mit HAVING auf die Kennzahl prüfen.
Beispiel: WHERE und HAVING kombiniert
Nur deutsche Kunden betrachten, dann Städte mit Gesamtumsatz über 50.000 zeigen:
SELECT Stadt, SUM(Umsatz) AS Umsatz FROM Kunden WHERE Land = 'Deutschland' GROUP BY Stadt HAVING SUM(Umsatz) > 50000;
Stolperfalle
Eine typische Verwechslung: WHERE COUNT(*) > 1 führt zu einem Fehler, weil WHERE vor der Aggregation läuft – nutze hier HAVING. Umgekehrt ist es ineffizient, eine einfache Zeilenbedingung wie Land = 'Deutschland' ins HAVING zu schreiben: Sie gehört ins WHERE, damit weniger Zeilen überhaupt erst gruppiert werden müssen.