SQL HAVING ist eine Bedingung, die auf bereits grup­pier­te Einträge an­ge­wen­det werden kann. Sie funk­tio­niert mit Ag­gre­gats­funk­tio­nen und wird genutzt, um Er­geb­nis­men­gen ein­zu­schrän­ken.

Was ist SQL HAVING?

Neben dem bekannten WHERE gibt es in der Struc­tu­red Query Language eine weitere Bedingung, die häufig genutzt wird. SQL HAVING wurde hin­zu­ge­fügt, um Daten anhand be­stimm­ter Kriterien zu filtern. Die Bedingung wird mit dem SQL-Befehl SELECT und der Anweisung SQL GROUP BY an­ge­wen­det. Während die letztere Er­geb­nis­se gruppiert, schränkt SQL HAVING diese Er­geb­nis­men­ge mit Hilfe un­ter­schied­li­cher Ag­gre­gats­funk­tio­nen ein. Die Bedingung wurde ein­ge­führt, da WHERE nicht mit Ag­gre­gats­funk­tio­nen wie SQL AVG(), SQL COUNT(), MAX(), MIN() und SUM() in­ter­agie­ren kann. SQL HAVING wird hinter den An­wei­sun­gen WHERE (sofern vorhanden) und GROUP BY, aber vor ORDER BY ein­ge­setzt.

vServer / VPS
VPS un­schlag­bar günstig auf Dell En­ter­pri­se Servern
  • 1 Gbit/s, un­be­grenzt Traffic & mehr Cores
  • Min­des­tens 99,99% Ver­füg­bar­keit & ISO-zer­ti­fi­zier­te Re­chen­zen­tren
  • Aus­ge­zeich­ne­ter 24/7 Premium-Support mit per­sön­li­chem Berater

Syntax und Funk­ti­ons­wei­se

Um die Funk­ti­ons­wei­se und den Nutzen von SQL HAVING zu verstehen, lohnt sich ein Blick auf die Syntax der Klausel. Diese sieht so aus:

SELECT name_der_spalte(n)
FROM name_der_tabelle
WHERE bedingung
GROUP BY name_der_spalte(n)
HAVING bedingung
ORDER BY name_der_spalte(n);
sql

Häufig wird eine Ag­gre­gats­funk­ti­on auf eine oder mehrere Spalten an­ge­wen­det. Danach wird zur Lo­ka­li­sie­rung der Name der Tabelle angegeben. Die Bedingung WHERE ist optional. GROUP BY fasst iden­ti­sche Werte zu Gruppen zusammen, die mit HAVING noch genauer gefiltert und mit ORDER BY in die ge­wünsch­te Rei­hen­fol­ge gebracht werden.

Beispiel für die Bedingung

Am ein­fachs­ten lässt sich SQL HAVING mit Hilfe eines einfachen Beispiels ver­an­schau­li­chen. Dafür erstellen wir eine kleine Tabelle namens „Kun­den­lis­te“. Diese enthält die Spalten „Kun­den­num­mer“, „Name“, „Standort“ und „Artikel“:

Kun­den­num­mer Name Standort Artikel
1427 Schmidt Berlin 13
1377 Schulz Hamburg 9
1212 Peters Hamburg 15
1431 Müller München 22
1118 Becker Berlin 10

Nun nutzen wir SQL HAVING, um her­aus­zu­fin­den, wie viele Kunden und Kundinnen aus Hamburg zehn oder mehr Artikel bestellt haben. Dafür verwenden wir den folgenden Code und geben die Anzahl mit Hilfe eines SQL-Aliases als „An­zahl­Be­stel­lun­gen“ an:

SELECT Standort, COUNT(Standort) AS AnzahlBestellungen
FROM Kundenliste
WHERE Standort = 'Hamburg'
GROUP BY Standort, Artikel
HAVING Artikel > 10;
sql

Die ent­spre­chen­de Ausgabe sieht fol­gen­der­ma­ßen aus:

Standort An­zahl­Be­stel­lun­gen
Hamburg 1

Die Bedingung in Kom­bi­na­ti­on mit INNER JOIN

Auch mit dem Keyword INNER JOIN können Sie SQL HAVING kom­bi­nie­ren. Dafür erstellen wir eine zweite Tabelle namens „Artikel_01“, in der hin­ter­legt wird, wie oft und wann ein be­stimm­ter Artikel bestellt wurde. Sie enthält eine Be­stell­num­mer, eine Kun­den­num­mer, die Anzahl und ein Be­stell­da­tum und sieht aus wie folgt:

Be­stell­num­mer Kun­den­num­mer Anzahl Datum
00283 1427 4 2024-01-15
00284 1211 7 2024-01-19
00285 1275 15 2024-01-29
00286 1431 10 2024-02-01
00287 1427 9 2024-02-05

Nun können wir das System zum Beispiel anweisen, uns alle Kundinnen und Kunden an­zu­zei­gen, die mehr als eine Be­stel­lung auf­ge­ge­ben haben. Der passende Code ist dieser:

SELECT Kundenliste.Name, COUNT(Artikel_01.Bestellnummer) AS AnzahlBestellungen
FROM (Artikel_01
INNER JOIN Kundenliste ON Artikel_01.Kundennummer = Kundenliste.Kundennummer)
GROUP BY Name
HAVING COUNT(Artikel_01.Bestellnummer) > 1;
sql

Dies ist die Ausgabe, die wir dann erhalten:

Name An­zahl­Be­stel­lun­gen
Schmidt 2

Al­ter­na­ti­ve zu SQL HAVING

Eine Al­ter­na­ti­ve zu SQL HAVING ist WHERE. Dabei können beide Optionen al­ler­dings nicht genau gleich verwendet werden. WHERE wird für einzelne Einträge ein­ge­setzt und kann neben SELECT auch mit DELETE oder UPDATE kom­bi­niert werden. HAVING ist hingegen aus­schließ­lich für grup­pier­te Einträge vor­ge­se­hen und nur mit SELECT kom­pa­ti­bel. WHERE wird vor GROUP BY ein­ge­setzt und HAVING danach. Außerdem kann nur SQL HAVING mit Ag­gre­gats­funk­tio­nen arbeiten.

Tipp

Ein Server, der perfekt auf Ihre An­for­de­run­gen zu­ge­schnit­ten ist: Mit SQL-Server-Hosting von IONOS wählen Sie zwischen MSSQL, MySQL und MariaDB und pro­fi­tie­ren von einer starken Si­cher­heits­ar­chi­tek­tur, her­vor­ra­gen­der Per­for­mance und einer per­sön­li­chen Beratung zu jeder Zeit.

Zum Hauptmenü