SQL: mit dem Schlüsselwort „HAVING“ Gruppierungen filtern

Wenn du mit Daten arbeitest, kommst du irgendwann an den Punkt, an dem du Werte gruppieren und bestimmte Bedingungen auf diese Gruppierungen anwenden möchtest. Dafür bietet SQL das Schlüsselwort HAVING. Es unterscheidet sich von der WHERE-Klausel und kann etwas kniffliger sein, aber einmal verstanden, wird es ein mächtiges Werkzeug für dich sein.

In diesem Artikel erkläre ich dir ganz verständlich, wie HAVING funktioniert, wann du es einsetzt und wie du es mit Beispielen in deiner Tabelle anwenden kannst.


Was ist HAVING?

HAVING ist eine spezielle SQL-Klausel (ein Teil eines Befehls), die dazu dient, Gruppierungen zu filtern, nachdem diese bereits erstellt wurden. Es wird meistens in Kombination mit der GROUP BY-Klausel verwendet.

Während die WHERE-Klausel Bedingungen für einzelne Zeilen vor der Gruppierung prüft, kommt HAVING erst danach ins Spiel und filtert ganze Gruppen, die von GROUP BY gebildet wurden.


HAVING vs. WHERE: Der wichtigste Unterschied

  • WHERE filtert Zeilen vor der Gruppierung.
  • HAVING filtert Gruppen nach der Gruppierung.

Beispiel: Unterschied zwischen WHERE und HAVING

Angenommen, wir haben eine Tabelle „Personen“, die wie folgt aussieht:

IDVornameNachnameAlterStadt
1AlbertEinstein76Princeton
2MarieCurie66Paris
3MahatmaGandhi78Delhi
4MartinLuther62Berlin
5MarieCurie29Paris

Wenn wir z. B. alle Personen aus Paris herausfiltern wollen, nutzen wir die WHERE-Klausel:

SELECT Vorname, Nachname 
FROM Personen
WHERE Stadt = 'Paris';

Ergebnis: | Vorname | Nachname | |———–|———-| | Marie | Curie | | Marie | Curie |

Nun schauen wir uns aber nicht einzelne Zeilen an, sondern möchten wissen, welche Stadt Bewohner hat, deren Durchschnittsalter höher als 65 Jahre ist. Hier hilft HAVING, da wir eine Aggregatfunktion wie AVG() (Durchschnitt) verwenden. Dies würde mit WHERE nicht funktionieren:

SELECT Stadt, AVG(Alter) AS Durchschnittsalter
FROM Personen
GROUP BY Stadt
HAVING AVG(Alter) > 65;

Ergebnis: | Stadt | Durchschnittsalter | |————|———————| | Princeton | 76.0 | | Delhi | 78.0 |

Warum funktioniert HAVING hier, aber WHERE nicht?

Weil AVG(Alter) erst nach der Gruppierung berechnet wird. WHERE arbeitet vor der Berechnung und kann somit nichts mit solchen „Gruppendaten“ wie Durchschnitt, Summe usw. anfangen.


Wie wird HAVING verwendet?

Die grundlegende Syntax von HAVING ist:

SELECT spaltenname, aggregatfunktion
FROM tabelle
GROUP BY spaltenname
HAVING bedingung;

Wichtig ist hier:

  1. Du nutzt eine Aggregatfunktion (z. B. SUM, AVG, COUNT, MIN, MAX).
  2. Die HAVING-Bedingung wird auf das Ergebnis der Gruppierung angewendet.

Beispiele mit der Tabelle „Personen“

Beispiel 1: Städte mit mehr als zwei Bewohnern

Wir möchten wissen, welche Städte mehr als zwei Bewohner haben. Dafür nutzen wir die Aggregatfunktion COUNT(). Diese zählt, wie viele Zeilen (Bewohner) zu jeder Stadt gehören.

SELECT Stadt, COUNT(*) AS Bewohneranzahl
FROM Personen
GROUP BY Stadt
HAVING COUNT(*) > 2;

Ergebnis: | Stadt | Bewohneranzahl | |———–|—————-| | Paris | 2 |

Erklärung:

  • GROUP BY Stadt gruppiert alle Personen nach ihren Wohnorten (Stadt).
  • COUNT(*) zählt, wie viele Zeilen jede Stadt hat.
  • HAVING COUNT(*) > 2 filtert nur die Gruppen, wo die Anzahl der Zeilen größer als 2 ist.

Beispiel 2: Durchschnittliches Alter pro Stadt filtern

Nehmen wir an, wir wollen nur Städte sehen, in denen das durchschnittliche Alter über 65 Jahre liegt.

SELECT Stadt, AVG(Alter) AS Durchschnittsalter
FROM Personen
GROUP BY Stadt
HAVING AVG(Alter) > 65;

Ergebnis: | Stadt | Durchschnittsalter | |————|———————| | Princeton | 76.0 | | Delhi | 78.0 |

Beispiel 3: Maximales Alter pro Stadt herausfinden

Welche Städte haben einen Bewohner mit einem Maximalalter über 75? Dazu nutzen wir MAX(), um das höchste Alter in jeder Stadt zu ermitteln.

SELECT Stadt, MAX(Alter) AS ÄltesterBewohner
FROM Personen
GROUP BY Stadt
HAVING MAX(Alter) > 75;

Ergebnis: | Stadt | ÄltesterBewohner | |————|——————| | Princeton | 76 | | Delhi | 78 |


Kann ich HAVING ohne GROUP BY verwenden?

Ja, du kannst HAVING auch ohne GROUP BY nutzen, aber nur, wenn keine Aggregatfunktion vorhanden ist. In diesem Fall bezieht sich HAVING auf die vollständige Ergebnismenge.

Beispiel:

SELECT COUNT(*) AS Gesamtanzahl
FROM Personen
HAVING COUNT(*) > 3;

In diesem Fall wird geprüft, ob die Gesamtausgabe der Tabelle Personen (alle Einträge) mehr als drei Zeilen hat.


Einschränkungen von HAVING in verschiedenen Datenbanken

Die HAVING-Klausel wird im allgemeinen SQL-Standard unterstützt und ist in den meisten modernen Datenbanken verfügbar. Unterschiede zwischen den Plattformen existieren jedoch kaum im Verhalten.

PlattformHAVING UnterstützungBemerkung
MariaDBJaVollständig unterstützt
MSSQLJaVollständig unterstützt
MySQLJaVollständig unterstützt
OracleJaVollständig unterstützt
SQLiteJaVollständig unterstützt

Da alle erwähnten Datenbanken HAVING nativ unterstützen, brauchst du bei der Anwendung keine speziellen Alternativen oder Workarounds.


Fazit

Die HAVING-Klausel ist ein mächtiges Werkzeug, wenn du Gruppierungen analysieren und filtern möchtest. Während WHERE direkt auf Zeilen arbeitet, erlaubt dir HAVING, Bedingungen auf Gruppenergebnisse anzuwenden. Sie ist unverzichtbar bei der Arbeit mit Aggregatfunktionen wie SUM(), AVG() oder COUNT().

Zusammengefasst:

  1. Nutze HAVING in Kombination mit GROUP BY, um Gruppierungen zu filtern.
  2. Verwende Aggregatfunktionen wie COUNT, AVG und SUM in HAVING-Bedingungen.
  3. Erinner dich daran, dass HAVING nach der Gruppierung wirksam wird, während WHERE davor ansetzt.

Mit den richtigen Kenntnissen von HAVING kannst du komplexe Datenanalysen durchführen und tiefere Einblicke in deine Daten erhalten.