Direkt zum Inhalt
HeimAnleitungenSQL

Wie man GROUP BY und HAVING in SQL verwendet

Ein intuitiver Leitfaden zum Entdecken der zwei beliebtesten SQL-Befehle zum Aggregieren von Zeilen deines Datensatzes
Aktualisierte 11. Sept. 2024  · 6 Min. lesen

Aggregation ist ein anderer Name für das Zusammenfassen deiner Datenpunkte zu einem einzigen Wert. Zum Beispiel, indem du den Mittelwert oder das Minimum berechnest. Wenn du alle deine Daten aggregierst, erhältst du manchmal einen Wert, der nicht nützlich ist.

Wenn du zum Beispiel das Kaufverhalten in deinem Laden untersuchst und die Kunden eine Mischung aus armen Studenten und reichen Berufstätigen sind, ist es aufschlussreicher, die durchschnittlichen Ausgaben für diese Gruppen getrennt zu berechnen. Das heißt, du musst die ausgegebenen Beträge nach verschiedenen Kundensegmenten gruppiert zusammenfassen.

Dieser Lehrgang behandelt die SQL-Anweisung GROUP BY sowie die Anweisung HAVING, mit der du steuern kannst, welche Datenzeilen in jeder Gruppe enthalten sind. 

HAVING steht in engem Zusammenhang mit der Anweisung WHERE, und du möchtest vielleicht die Einführung in die WHERE-Klausel in SQL Tutorium lesen. Du musst auch die Anweisungen SELECT und FROM verstehen, wie sie in den SQL-Abfragebeispiele und Tutorial.

Um den Beispielcode in diesem Lehrgang ganz einfach selbst auszuführen, kannst du kostenlos eine DataLab-Arbeitsmappe erstellen, in der SQL, die Datenbank und alle Codebeispiele für dich vorinstalliert sind.

Lass uns loslegen!

SQL Upskilling für Einsteiger

Erwerbe die SQL-Kenntnisse, um mit deinen Daten zu interagieren und sie abzufragen.
Kostenloses Lernen Beginnen

Datenbank der Einhorn-Unternehmen

Wir werden die Unicorn Companies Database verwenden, die auf DataLab, dem KI-fähigen Daten-Notebook von DataCamp, verfügbar ist. Diese Unternehmen werden "Einhorn" genannt, weil sie Startup-Unternehmen mit einer Bewertung von über einer Milliarde Dollar sind. Diese Datenbank enthält also die Daten dieser Einhorn-Unternehmen und besteht aus sieben Tabellen. Der Einfachheit halber werden wir uns auf drei Tabellen konzentrieren: companies, sales, und product_emissions.

SQL verwenden GROUP BY

GROUP BY ist ein SQL-Befehl, der häufig verwendet wird, um die Daten zu aggregieren und daraus Erkenntnisse zu gewinnen. Wenn du Daten gruppierst, gibt es drei Phasen:

  • Aufteilen: Der Datensatz wird auf der Grundlage der Werte der Variablen, die wir für die Aggregation ausgewählt haben, in einzelne Zeilen aufgeteilt.
  • Bewirb dich: Berechne eine Aggregatfunktion, wie Durchschnitt, Minimum und Maximum, die einen einzelnen Wert zurückgibt
  • Kombiniere: Alle diese Ergebnisse werden in einer einzigen Tabelle zusammengefasst. Auf diese Weise erhalten wir einen einzigen Wert für jede Modalität der interessierenden Variable.

SQL GROUP BY Beispiel 1

Wir können damit beginnen, ein einfaches Beispiel für GROUP BY zu zeigen. Angenommen, wir wollen die zehn Länder mit der höchsten Anzahl an Einhorn-Unternehmen finden. 

SELECT * 
FROM companies

Screenshot 2023-02-21 at 19.04.00.png

Es wäre auch schön, die Ergebnisse in absteigender Reihenfolge nach der Anzahl der Unternehmen zu sortieren.

SELECT country, COUNT(*) AS n_companies
FROM companies
GROUP BY country
ORDER BY n_companies DESC
LIMIT 10

image4.png

Hier haben wir die Ergebnisse. Es wird dich wahrscheinlich nicht überraschen, dass die USA, China und Indien auf der Rangliste stehen. Lass uns die Entscheidung hinter dieser Abfrage erklären: 

  • Beachte zunächst, dass wir COUNT(*) verwendet haben, um die Zeilen für jede Gruppe, die dem Land entspricht, zu zählen. Außerdem haben wir den SQL-Alias verwendet, um die Spalte in einen besser verständlichen Namen umzubenennen. Dies ist möglich, indem du das Schlüsselwort AS verwendest, gefolgt von dem neuen Namen. COUNT wird im Tutorial COUNT() SQL FUNCTION ausführlicher behandelt.
  • Die Felder wurden aus der Tabelle Unternehmen ausgewählt, wobei jede Zeile einem Unicorn-Unternehmen entspricht. 
  • Danach müssen wir den Spaltennamen nach GROUP BY angeben, um die Daten nach dem Land zu aggregieren. 
  • ORDER BY ist erforderlich, um die Länder in der richtigen Reihenfolge darzustellen, von der höchsten Anzahl an Unternehmen bis zur geringeren Anzahl an Unternehmen. 
  • Wir begrenzen die Ergebnisse auf 10 mit LIMIT, gefolgt von der Anzahl der Zeilen, die du in den Ergebnissen haben möchtest.

SQL GROUP BY Beispiel 2 

Jetzt werden wir die Tabelle mit den Verkäufen analysieren. Für jede Bestellnummer haben wir die Art des Kunden, die Produktlinie, die Menge, den Stückpreis, den Gesamtbetrag usw.

Screenshot 2023-02-21 at 19.05.13.png

Diesmal interessieren wir uns für den Durchschnittspreis pro Einheit, die Gesamtzahl der Bestellungen und den Gesamtgewinn für jede Produktlinie:

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
GROUP BY product_line
ORDER BY total_gain DESC

image7.png

  • Anstatt die Anzahl der Zeilen zu zählen, haben wir die Funktion AVG(), um den Durchschnittspreis zu erhalten, und die Funktion SUM(), um die Gesamtzahl der Bestellungen und den Gesamtgewinn für jede Produktlinie zu berechnen. 
  • Wie zuvor geben wir die Spalte an, die den Datensatz zunächst in Stücke unterteilt. Mit den Aggregationsfunktionen können wir dann eine Zeile für jede Modalität der Produktlinie erhalten. 
  • Dieses Mal ist ORDER BY optional. Er wurde aufgenommen, um zu verdeutlichen, dass die höheren Gesamtgewinne nicht immer proportional zu den höheren Durchschnittspreisen oder der Gesamtstückzahl sind. 

Die Grenzen der WHERE

Nehmen wir noch einmal das vorherige Beispiel. Jetzt wollen wir die Abfrage mit einer Bedingung versehen: Wir wollen nur nach der Gesamtzahl der Bestellungen über 40.000 filtern. Versuchen wir es mit der WHERE Klausel:

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
WHERE SUM(total) > 40000
GROUP BY product_line
ORDER BY total_gain DESC

Diese Abfrage wird den folgenden Fehler zurückgeben:

image1.png

Dieser Fehler ist nicht möglich, wenn du aggregierte Funktionen in der WHERE Klausel übergibst. Wir brauchen einen neuen Befehl, um dieses Problem zu lösen.

SQL HAVING verwenden

Wie WHERE filtert auch die HAVING Klausel die Zeilen einer Tabelle. Während WHERE versucht, die gesamte Tabelle zu filtern, filtert HAVING die Zeilen innerhalb jeder der Gruppen, die durch GROUP BY

SQL HAVING Beispiel 1

Hier ist das vorherige Beispiel noch einmal, wobei das Wort WHERE durch HAVING ersetzt wurde.

SELECT 
    product_line,
    AVG(unit_price) AS avg_price,
    SUM(quantity) AS tot_pieces,
    SUM(total) AS total_gain
FROM sales
GROUP BY product_line
HAVING SUM(total) > 40000
ORDER BY total_gain DESC

image10.png

Dieses Mal werden drei Reihen erzeugt. Die anderen Produktlinien erfüllten das Kriterium nicht, sodass wir von sechs Ergebnissen auf drei kamen. 

Was fällt dir bei der Abfrage noch auf? Wir haben nicht den Spaltenalias an HAVING übergeben, sondern die Aggregation des ursprünglichen Feldes. Fragst du dich, warum? Du wirst das Geheimnis im nächsten Beispiel lüften.

SQL HAVING Beispiel 2

Als letztes Beispiel verwenden wir die Tabelle product_emissions, die die Emissionen der von den Unternehmen angebotenen Produkte enthält.

Screenshot 2023-02-21 at 19.07.31.png

Dieses Mal interessieren wir uns für den durchschnittlichen Product Carbon Footprint (pcf) für jedes Unternehmen, das zur Industriegruppe "Technology Hardware & Equipment" gehört. Außerdem wäre es hilfreich, die Anzahl der Produkte für jedes Unternehmen zu sehen, um zu verstehen, ob es einen Zusammenhang zwischen der Anzahl der Produkte und dem Carbon Footprint gibt. Wir verwenden auch wieder HAVING, um Unternehmen mit einem durchschnittlichen Carbon Footprint von über 100 herauszufiltern.

SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg_carbon_footprint_pcf>100
ORDER BY n_products

image5.png

Beim Versuch, den Alias zu verwenden, trat ein Fehler auf. Für die HAVING Klausel existiert der Name der neuen Spalte nicht, sodass sie die Abfrage nicht filtern kann. Lass uns die Anfrage korrigieren:

SELECT pe.company, count(product_name) AS n_products, avg(carbon_footprint_pcf) AS avg_carbon_footprint_pcf
FROM product_emissions AS pe
WHERE industry_group = 'Technology Hardware & Equipment'
GROUP BY pe.company, industry_group
having avg(carbon_footprint_pcf)>100
ORDER BY n_products

image3.png

Dieses Mal hat die Bedingung funktioniert, und wir können die Ergebnisse in der Tabelle sehen. Wir haben gerade gelernt, dass Spaltenaliase nicht in HAVING verwendet werden können, weil diese Bedingung vor der SELECT angewendet wird. Aus diesem Grund kann es die Felder nicht anhand der neuen Namen erkennen.

SQL-Ausführungsreihenfolge

Das ist die Reihenfolge der Befehle beim Schreiben der Abfrage:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

Aber es gibt eine Frage, die du dir stellen musst. In welcher Reihenfolge werden die SQL-Befehle ausgeführt? Als Menschen gehen wir oft davon aus, dass der Computer SQL von oben nach unten liest und interpretiert. Aber die Realität sieht anders aus, als es vielleicht den Anschein hat. Das ist die richtige Reihenfolge der Ausführung:

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT

 Der Abfrageprozessor beginnt also nicht mit SELECT, sondern mit der Auswahl der einzubeziehenden Tabellen, und SELECT wird nach HAVING ausgeführt. Das erklärt, warum HAVING die Verwendung von ALIAS nicht zulässt, während ORDER BY keine Probleme damit hat. Zusätzlich zu diesem Aspekt verdeutlicht diese Reihenfolge der Ausführung den Grund, warum HAVING zusammen mit GROUP BY verwendet wird, um Bedingungen auf aggregierte Daten anzuwenden, während WHERE dies nicht kann. 

Nimm es auf die nächste Stufe

Nach der Lektüre dieses Tutorials solltest du eine klare Vorstellung vom Unterschied zwischen GROUP BY und HAVING haben. Du kannst im DataLab üben, um diese Konzepte zu beherrschen.

Wenn du auf die nächste Stufe des SQL-Lernpfads wechseln möchtest, kannst du unseren SQL-Kurs für Fortgeschrittene besuchen. Wenn du deine SQL-Grundlagen noch vertiefen musst, kannst du zum Kurs Einführung in SQL zurückkehren, um die Grundlagen der Sprache zu lernen. 

Werde SQL-zertifiziert

Beweise mit einer Zertifizierung, dass deine SQL-Kenntnisse für den Job geeignet sind.
Themen

SQL-Kurse

Zertifizierung verfügbar

Course

Einführung in SQL

2 hr
780.6K
Lerne in nur zwei Stunden, wie man relationale Datenbanken mit SQL erstellt und abfragt.
See DetailsRight Arrow
Start Course
Mehr anzeigenRight Arrow