24th Nov 2022 6 Leseminuten Was ist die SQL HAVING-Klausel? András Novoszáth GROUP BY Inhaltsverzeichnis Der Datensatz und das Problem GROUP BY: Eine Zusammenfassung Wann wird SQL HAVING verwendet? Die SQL HAVING-Syntax Beispiele für HAVING Sie können WHERE nicht zum Filtern von Gruppen verwenden Sowohl WHERE als auch HAVING in einer Abfrage verwenden Erfahren Sie mehr über SQL HAVING! 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? Tags: GROUP BY