24th Nov 2022 5 Leseminuten Die SQL HAVING-Klausel erklärt Dorota Wdzięczna GROUP BY Inhaltsverzeichnis Was ist die SQL HAVING-Klausel? HAVING-Syntax Filtern von Zeilen mit WHERE und HAVING Filtern von Zeilen nach mehreren Werten mit HAVING Der Unterschied zwischen HAVING und WHERE HAVING: Eine sehr nützliche Klausel 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. Tags: GROUP BY