Zurück zur Artikelliste Artikel
5 Leseminuten

Die SQL HAVING-Klausel erklärt

Was ist die SQL HAVING-Klausel? Wozu braucht man sie, und wo verwendet man sie? Wir werden HAVING im Detail erklären.

HAVING ist eine sehr häufige Klausel in SQL-Abfragen. Wie WHERE hilft sie beim Filtern von Daten; HAVING funktioniert jedoch auf andere Weise. Wenn Sie mit der GROUP BY-Klausel vertraut sind und nur von HAVING gehört haben - oder wenn Sie mit HAVING überhaupt nicht vertraut sind - ist dieser Artikel genau das Richtige für Sie. Lesen Sie weiter und erweitern Sie Ihr Wissen über HAVING in SQL!

Was ist die SQL HAVING-Klausel?

In SQL wird die HAVING-Klausel verwendet:

  • Filtert Daten nach bestimmten Kriterien.
  • Wird üblicherweise bei der Erstellung von Berichten verwendet.
  • Wird nur in SELECT verwendet.
  • Funktioniert mit GROUP BY.

Wenn Sie die GROUP BY-Klausel kennen, wissen Sie, dass sie zur Aggregation von Werten verwendet wird: Sie ordnet Datensätze in Gruppen ein, um Aggregationswerte (Statistiken) für sie zu berechnen. HAVING filtert Datensätze nach diesen Aggregatwerten. Wir werden das hier ausführlich besprechen, aber mehr Details finden Sie in unserem interaktiven Kurs SQL für Anfänger.

Wenn Sie eine Auffrischung zu GROUP BY benötigen, empfehle ich die Artikel Getting the Hang of the GROUP BY Clause von Marian Dziubak und Grouping Data in SQL Server von Belma Mesihovic.

HAVING-Syntax

Bevor wir mit einem Beispiel beginnen, sollten wir uns die Syntax der HAVING-Klausel ansehen. HAVING wird immer nach der WHERE- und GROUP BY-Klausel, aber vor der ORDER BY-Klausel platziert. Sehen Sie sich das an:

SELECT column_list 
FROM table_name
WHERE where_conditions
GROUP BY column_list
HAVING having_conditions
ORDER BY order_expression

Die HAVING-Klausel gibt die Bedingung oder die Bedingungen für eine Gruppe oder eine Aggregation an.

Die employee Tabelle unten hilft uns bei der Analyse der HAVING-Klausel. Sie enthält die IDs der Mitarbeiter (die Spalte emp_id ), die department, in der der Mitarbeiter arbeitet, und die salary des Mitarbeiters.

employee_iddepartmentsalary
1HR23000
2HR28000
3Finance35000
4Marketing15000
5Marketing25000
6Finance56000
7Finance41000

Um die Summe der Gehälter für jede Abteilung zu berechnen, würden Sie diese Abfrage schreiben:

SELECT department, SUM(salary)
FROM employee
GROUP BY department;

Hier ist das Ergebnis:

departmentsalary
HR51000
Marketing40000
Finance132000

Nehmen wir nun an, dass Sie die Abteilungen anzeigen müssen, in denen die Summe der Gehälter 50.000 $ oder mehr beträgt. In diesem Fall sollten Sie eine HAVING-Klausel verwenden:

SELECT department, SUM(salary)
FROM employee
GROUP BY department
HAVING SUM(salary) >= 50000;

Und das Ergebnis ist:

departmentsalary
HR51000
Finance132000

Wie Sie sehen, enthält die Ergebnismenge nur die Summe der Gehälter für die Abteilungen Personal und Finanzen. Der Grund dafür ist, dass die Summe der Marketing-Gehälter unter 50.000 $ liegt.

Diese Abfrage gruppiert zunächst die Datensätze nach Abteilungen und berechnet die aggregierten Werte - in diesem Fall die Summe aller Gehälter. Im nächsten Schritt wird die Bedingung in HAVING geprüft: Wir vergleichen den von SUM(salary) zurückgegebenen Wert für eine bestimmte Abteilung mit 50.000 $. Wenn dieser Wert 50.000 $ oder mehr beträgt, wird der Datensatz zurückgegeben. In unserem Beispiel werden die summierten Gehälter für die Abteilungen HR (51.000 $) und Finanzen (132.000 $) angezeigt.

Filtern von Zeilen mit WHERE und HAVING

Als Nächstes sehen wir uns an, wie man Zeilen auf der Datensatzebene und auf der Gruppenebene in derselben Abfrage filtern kann. Sehen Sie sich zunächst die Daten in der Berichtstabelle an sale:

salesman_idsale_monthtotal_value
1January34000
1February14000
1March22000
1April2000
2January20000
2February0
2March17000
2April0
3March1000
3April35000

Die folgende Abfrage wählt die Summe aller Verkäufe für jeden Verkäufer aus, dessen durchschnittlicher Verkaufswert höher als 20.000 $ ist. (Hinweis: Der Verkäufer mit ID=3 ist nicht enthalten, da er erst im März angefangen hat zu arbeiten).

SELECT salesman_id, SUM(total_value)  
FROM sale 
WHERE salesman_id != 3
GROUP BY salesman_id 
HAVING SUM(total_value) > 40000;

Hier ist das Ergebnis:

salesman_idsum
172000

Diese Abfrage filtert zunächst Datensätze, indem sie die WHERE-Klausel verwendet, um Datensätze mit einer anderen Verkäufer-ID als 3 auszuwählen (WHERE salesman_id != 3). Anschließend wird die Summe der Gesamtverkäufe für die Vertriebsmitarbeiter mit den IDs 1 und 2 berechnet. Zu diesem Zweck werden die Datensätze für beide Vertreter einzeln gruppiert (GROUP BY salesman_id). Am Ende filtert die Abfrage Datensätze, indem sie HAVING verwendet, um zu prüfen, ob der Gesamtwert (Summe der Gesamtverkäufe) über 40.000 $ liegt (HAVING SUM(total_value) > 40000).

Filtern von Zeilen nach mehreren Werten mit HAVING

Mit der HAVING-Klausel können Sie auch Zeilen nach mehr als einem Aggregatwert filtern (d. h. nach Werten aus verschiedenen Aggregatfunktionen). Sehen Sie sich die nächste Abfrage an:

SELECT salesman_id, SUM(total_value) 
FROM sale 
WHERE salesman_id != 3
GROUP BY salesman_id 
HAVING SUM(total_value) > 36000 AND AVG(total_value) > 15000;

Das Ergebnis:

salesman_idsum
172000

Diese Abfrage gibt die IDs der Verkäufer zurück, die 1) einen Gesamtumsatz von mehr als 36.000 $ haben und 2) einen durchschnittlichen Umsatz von mehr als 15.000 $ pro Monat. Nur der Vertriebsmitarbeiter mit ID=1 erfüllt die beiden Bedingungen. Beachten Sie, dass wir nicht den durchschnittlichen Gesamtumsatz für jeden Verkäufer ausgewählt haben, sondern nur die Summe aller Umsätze; der Durchschnitt steht nur in der HAVING-Bedingung.

Der Unterschied zwischen HAVING und WHERE

Das Beispiel aus dem letzten Abschnitt hat gezeigt, wie man Datensätze sowohl mit WHERE als auch mit HAVING filtern kann. Jetzt werden wir den Unterschied zwischen diesen beiden Klauseln betrachten.

Der grundlegende Unterschied besteht darin, dass WHERE auf einzelne Datensätze wirkt und HAVING auf gruppierte Datensätze (nach der Verarbeitung von GROUP BY). HAVING wird nur in SELECT-Anweisungen verwendet, während WHERE in anderen Anweisungen wie DELETE oder UPDATE verwendet werden kann.

HAVING und WHERE filtern Daten zu unterschiedlichen Zeitpunkten. WHERE wird vor GROUP BY verarbeitet. Das bedeutet, dass zuerst die Datensätze ausgewählt und dann mit WHERE gefiltert werden. Dies ist eine Filterung auf Datensatzebene. Danach werden die Ergebnisdatensätze gruppiert und der aggregierte Wert wird berechnet.

HAVING filtert Datensätze auf Gruppenebene - nach WHERE und GROUP BY. HAVING prüft, ob der aggregierte Wert für eine Gruppe seine Bedingung(en) erfüllt. Sie sollten eine Aggregatfunktion zum Filtern von Datensätzen nur in HAVING verwenden; WHERE kann keine Aggregatfunktion enthalten.

Weitere Informationen über den Unterschied zwischen WHERE und HAVING finden Sie unter HAVING vs. WHERE in SQL: Was Sie wissen sollten von Ignacio L. Bisso.

HAVING: Eine sehr nützliche Klausel

HAVING ist in SQL-Abfragen sehr nützlich. Sie filtert Daten, nachdem Zeilen gruppiert und Werte aggregiert wurden - etwas, das Sie oft in Berichten tun.

Ich hoffe, dieser Artikel hat Ihnen geholfen, die HAVING-Klausel zu verstehen. Vielleicht regt er Sie sogar dazu an, Ihr SQL-Wissen zu erweitern. Wenn Sie mehr über SQL lernen möchten, besuchen Sie unseren interaktiven SQL für Anfänger Kurs auf der LearnSQL.de Plattform.