Zurück zur Artikelliste Artikel
6 Leseminuten

Was ist die SQL HAVING-Klausel?

Lernen Sie gerade SQL? Fragen Sie sich, wofür Sie die HAVING-Klausel verwenden können? Oder haben Sie vielleicht versucht, die WHERE für Ihre GROUP BY-Aggregaten zu verwenden? Dann sind Sie hier richtig! In diesem Artikel erklären wir Ihnen, wie Sie HAVING mit einer Vielzahl von Beispielen.

Haben Sie versucht, Ihre Metriken, die Sie mit GROUP BY erstellt haben, mit einer WHERE -Klausel zu filtern, und festgestellt, dass es nicht funktioniert hat? Das liegt daran, dass dies nicht die Funktion von WHERE ist. Sie brauchen eine HAVING Klausel!

In diesem Artikel erklären wir Ihnen, wie Sie HAVING verwenden, um Ihre aggregierten Daten zu filtern. Sie erfahren, wann und wie Sie die Klausel verwenden, ihre Syntax und den Unterschied zu WHERE. Wir zeigen dies anhand von detaillierten Beispielen aus einem Filmverleih.

Sind Sie bereit? Dann nichts wie los!

Der Datensatz und das Problem

In diesem Artikel verwenden wir die film Tabelle aus dem Sakila-Beispieldatensatz. Sie enthält eine Liste von Filmen, die man bei einem fiktiven DVD-Verleih ausleihen kann.

Hier ist eine Beispielabfrage und ihr Ergebnis.

SELECT
	title,
	release_year,
	language_id,
	rental_duration,
	length,
	rating
FROM
	film
LIMIT 10;
titlerelease_yearlanguage_idrental_durationlengthrating
ACADEMY DINOSAUR20061686PG
ACE GOLDFINGER20061348G
ADAPTATION HOLES20061750NC-17
AFFAIR PREJUDICE200615117G
AFRICAN EGG200616130G
AGENT TRUMAN200613169PG
AIRPLANE SIERRA20061662PG-13
AIRPORT POLLOCK20061654R
ALABAMA DEVIL200613114PG-13
ALADDIN CALENDAR20061663NC-17

Mit diesen Daten wollen wir herausfinden, welche Arten von Filmen die Leute für kürzere oder längere Zeiträume ausleihen. Anhand dieser Informationen können wir die Art von Filmen und die Zielgruppe ermitteln, auf die wir uns konzentrieren könnten.

GROUP BY: Eine Zusammenfassung

Wir verwenden HAVING für Gruppen, die mit einer GROUP BY Klausel erstellt wurden.

Erinnern wir uns kurz daran, wie wir Daten mit GROUP BY zusammenfassen. Wir verwenden GROUP BY, um unsere Daten in aggregierten Metriken zusammenzufassen. Dazu benötigen wir zwei Dinge:

  • Eine Aggregationsfunktion wie COUNT, MAX, oder AVG.
  • Eine Spalte, über die wir aggregieren.

Wir wollen zum Beispiel wissen, wie viele Filme wir in jeder Bewertungskategorie haben. Um diese Frage zu beantworten, verwenden wir COUNT(*), um die Anzahl der Filme in jeder Gruppe zu zählen, und wir verwenden GROUP BY, um diese Metrik entsprechend den Werten der Spalte rating zu aggregieren:

SELECT
	rating,
	COUNT(*) AS films
FROM
	film
GROUP BY rating
ORDER BY rating;
ratingfilms
G178
PG194
PG-13223
R195
NC-17210

Das Ergebnis zeigt die Anzahl der Filme nach Bewertung. Die Verteilung der Filme nach Bewertung ist relativ gleichmäßig. Die beliebteste Einstufung ist PG-13, die unbeliebteste ist G.

Wenn Sie mehr über GROUP BY erfahren möchten, lesen Sie diesen ausführlichen Artikel oder diese Liste mit praktischen Beispielen.

Jetzt, wo wir uns angesehen haben, was GROUP BY ist, können wir es mit HAVING kombinieren!

Wann wird SQL HAVING verwendet?

Die Operation HAVING dient in erster Linie dazu, aggregierte Daten zu filtern. Sie können sie verwenden, wenn Sie Ihre Daten mit GROUP BY zu neuen Metriken zusammenfassen und die Ergebnisse auf der Grundlage dieser neuen Werte auswählen möchten.

Sie ähnelt der Operation WHERE, aber Sie verwenden sie unter anderen Umständen. Am Ende dieses Artikels werden Sie mehr über diesen Unterschied im Detail lesen.

Die SQL HAVING-Syntax

In Bezug auf die Syntax erfordert HAVING lediglich eine Zeile nach GROUP BY. Der folgende Ausschnitt fasst die Syntax zusammen, die für die Verwendung einer HAVING Klausel erforderlich ist:

SELECT
	aggregate_function(column)
FROM
	table
GROUP BY column_to_aggregate_on
HAVING condition_on_aggregate_metric;

Diese Syntax ist kurz und bündig, aber lassen Sie uns anhand von Beispielen sehen, wie sie funktioniert!

Beispiele für HAVING

Angenommen, wir wollen wissen, welche Filme die Leute länger oder kürzer ausleihen. Wir könnten an der Verleihdauer nach Bewertung interessiert sein. Wenn wir uns beispielsweise auf Filme mit kürzerer Leihdauer konzentrieren, können wir einen schnelleren Gesamtumsatz erzielen. Schauen wir uns an, was uns die Daten zu dieser Frage sagen können!

Wir erstellen zwei aggregierte Metriken, die nach Bewertung gruppiert sind. Dann verwenden wir HAVING, um die resultierende Tabelle nach der durchschnittlichen Verleihdauer zu filtern (avg_rentdur).

SELECT
	rating,
	COUNT(*) AS films,
	AVG(rental_duration),
	AVG(length)
FROM
	film
GROUP BY rating
HAVING AVG(rental_duration) > 5

HAVING Hier werden Daten auf der Grundlage einer Bedingung für eine Gruppe ausgewählt, die wir mit einer Aggregatfunktion erstellt haben (AVG).

ratingfilmsAVG(rental_duration)AVG(length)
PG1945.0825112.0052
NC-172105.1429113.2286
PG-132235.0538120.4439

Das Ergebnis enthält keine G- und R-Bewertungen, da deren durchschnittliche Verleihdauer kürzer als 5 Tage ist. Filme mit den Bewertungen PG, PG-13 oder NC-17 werden länger ausgeliehen.

Interessant!

Da wir die Kategorien nach ihrer Verleihdauer betrachten, können wir unsere Ergebnisse weiter filtern. Wir werden auch Bewertungen entfernen, deren durchschnittliche Länge über zwei Stunden liegt. Dazu fügen wir der HAVING -Klausel eine weitere Gruppenbedingung hinzu:

SELECT
	rating,
COUNT(*) AS films,
AVG(rental_duration),
AVG(length)
FROM
	film
GROUP BY rating
HAVING AVG(rental_duration) > 5
	AND AVG(length) < 120;

Die zusätzliche Bedingung auf AVG(length) filtert die Bewertung PG-13 heraus.

ratingfilmsAVG(rental_duration)AVG(length)
PG1945.0825112.0052
NC-172105.1429113.2286

Gut gemacht!

Sie können WHERE nicht zum Filtern von Gruppen verwenden

Wir haben erwähnt, dass HAVING ähnlich wie WHERE ist, aber wir verwenden sie in unterschiedlichen Szenarien. Schauen wir uns an, wie sich das in unserem Beispiel auswirkt.

Ersetzen wir HAVING durch WHERE in der Abfrage, die wir gerade geschrieben haben:

SELECT
	rating,
	COUNT(*) AS films,
	AVG(rental_duration),
	AVG(length)
FROM
	film
GROUP BY rating
WHERE AVG(rental_duration) > 5

Dies führt jedoch zu der folgenden Fehlermeldung:

ERROR 1064 (42000): Sie haben einen Fehler in Ihrer SQL-Syntax; lesen Sie im Handbuch zu Ihrer MySQL-Serverversion nach, welche Syntax Sie in der Nähe von 'WHERE avg_rentdur > 5' in Zeile 9 verwenden müssen

Das liegt daran, dass GROUP BY Klauseln nach WHERE Klauseln ausgeführt werden. Diese Abfrage versucht, WHERE auf avg_rentdur anzuwenden, wenn avg_rentdur noch nicht existiert!

Das bedeutet, dass wir WHERE nur auf "rohe" Daten anwenden können und nicht auf aggregierte Werte. Wir müssen HAVING auf aggregierte Metriken anwenden.

Sowohl WHERE als auch HAVING in einer Abfrage verwenden

Wir haben gesehen, dass wir WHERE verwenden, um einzelne Zeilen zu filtern, und HAVING, um nach Gruppen zu filtern. Um den Unterschied zwischen beiden zu verdeutlichen, sehen wir uns ein Beispiel an, in dem wir sowohl HAVING als auch WHERE verwenden!

Wir wollen wissen, wie sich unsere bisherigen Ergebnisse ändern, wenn wir uns auf kurze Filme konzentrieren. Zu diesem Zweck beschränken wir die Filmlänge auf 60 Minuten.

In unserer Abfrage tun wir dies, indem wir WHERE auf die Spalte Länge anwenden:

SELECT
	rating,
	COUNT(*) AS films,
	AVG(rental_duration),
	AVG(length)
FROM
	film
WHERE
	length < 60
GROUP BY rating
HAVING AVG(rental_duration) < 5;
ratingfilmsAVG(rental_duration)AVG(length)
G214.381053.0952
NC-17214.904851.3810
R114.636455.0000

Die Ergebnisse zeigen, dass wir, wenn wir uns nur auf Kurzfilme konzentrieren, mehrere Filme finden, die im Durchschnitt mit NC-17 eingestuft sind und nur kurze Verleihzeiten haben. Diese Erkenntnis kann uns Ideen für die Art von Filmen liefern, die wir in unser künftiges Angebot aufnehmen können.

Möchten Sie mehr über die Unterschiede zwischen HAVING und WHERE erfahren? Schauen Sie sich unseren ausführlichen Artikel zu diesem Thema an!

Erfahren Sie mehr über SQL HAVING!

Gefällt Ihnen, was Sie gerade gelernt haben? Stellen Sie sicher, dass Sie es nicht vergessen! SQL lernt man am besten, indem man Probleme anhand neuer und anspruchsvoller Beispiele löst. Sie können die gleiche Testumgebung einrichten, die wir hier verwenden, den gleichen Datensatz importieren und die Abfragen, die Sie gerade gelernt haben, neu schreiben.

Das könnte jedoch eine Menge Arbeit bedeuten, und Sie würden nur die gleichen Beispiele wiederholen. Stattdessen empfehlen wir Ihnen, unseren Übungskurs zu besuchen! Er wird Ihnen helfen, die SQL HAVING und andere Klauseln anhand neuer und anspruchsvoller Beispiele zu üben!

Was meinen Sie dazu? Sind Sie bereit dafür?