Zurück zur Artikelliste Artikel
10 Leseminuten

Wie man GROUP BY in SQL verwendet

In diesem Artikel geben wir Ihnen eine schrittweise Anleitung zur Verwendung von GROUP BY in SQL. Entdecken Sie die Feinheiten der GROUP BY Klausel und lernen Sie verschiedene Möglichkeiten kennen, sie zu verwenden.

GROUP BY ist eine der am häufigsten verwendeten Klauseln in SQL. Mit ihr können Sie nicht nur Daten aus der Datenbank auswählen, sondern auch Zeilen mit denselben Spaltenwerten in einer Gruppe zusammenfassen. In Verbindung mit den Aggregatfunktionen von SQL können Sie mit GROUP BY Metriken berechnen, wie z. B. die Anzahl der Instanzen zählen oder den Gesamt-, Durchschnitts-, Mindest- oder Höchstwert ermitteln.

GROUP BY gehört zu den grundlegenden SQL-Kenntnissen; Sie müssen sich erst einmal damit vertraut machen, bevor Sie zu komplizierteren Konzepten übergehen.

Sie wissen bereits, dass man das Schreiben von Code am besten durch Übung lernt. Wenn Sie nicht täglich mit SQL arbeiten, kann es schwierig sein, die Gelegenheit zu finden, regelmäßig SQL-Code zu schreiben. Schwierig, aber nicht unmöglich. Was es möglich macht, ist der SQL-Übungssatz Kurs. Er 88 Übungen bieten reichlich Gelegenheit, GROUP BY und einige andere SQL-Konzepte zu üben, wie Aggregatfunktionen, JOINs und Unterabfragen.

Wie funktioniert GROUP BY? Ein Beispiel

Ich verwende die Tabelle typewriter_products um die Bedeutung der GROUP BY-Klausel in SQL zu demonstrieren. Sie zeigt Dinge, die man bei einer fiktiven Firma kaufen kann, die Produkte rund um Schreibmaschinen verkauft. Für diejenigen, die sich vielleicht wundern: Das ist eine Schreibmaschine:

Wie man GROUP BY in SQL verwendet

Quelle: https://i.etsystatic.com/8429430/r/il/132716/1789166606/il_fullxfull.1789166606_1qnc.jpg

Fast wie ein Computer ohne Bildschirm. Wer weiß, wie viele wichtige Bücher mit einer Schreibmaschine geschrieben wurden. Bücher, wissen Sie noch?

(Aber genug der Selbstgefälligkeit! Sprechen Sie über den Tisch!)

Ja, die Tabelle. Sie hat die folgenden Spalten:

  • id - Die eindeutige ID des Datensatzes.
  • product_name - Der Name des Produkts.
  • product_id - Die ID des Produkts.
  • ribbon_brand - Die Marke des Farbbandes für die Schreibmaschine.
  • typewriter_brand - Die Marke der Schreibmaschine, für die das Farbband bestimmt ist.
  • ribbon_color - Die Farbe des Farbbandes für die Schreibmaschine.
  • units - Die Anzahl der verfügbaren Einheiten des Produkts.
  • price - Der Preis des Produkts pro Einheit.

Die Daten selbst sind unten dargestellt.

idproduct_nameproduct_idribbon_brandtypewriter_brandribbon_colorunitsprice
1typewriter ribbon1All You NeedOlympiaBlack8810.00
2typewriter ribbon1All You NeedOlympiaBlack + Red4810.00
3typewriter ribbon2Ribbons & UsOlympiaBlack9712.39
4typewriter ribbon2Ribbons & UsOlympiaBlack + Red14715.15
5typewriter ribbon3All You NeedUnderwoodBlack1424.74
6typewriter ribbon3All You NeedUnderwoodBlack + Red1325.17
7typewriter ribbon4Our RibbonUnderwoodBlack5425.00
8typewriter ribbon5Ribbons & UsUnderwoodBlack15730.47
9typewriter ribbon5Ribbons & UsUnderwoodBlack + Red1428.47
10typewriter ribbon6All You NeedAdlerBlack4420.00
11typewriter ribbon6All You NeedAdlerBlack + Red1630.00
12typewriter ribbon7Ribbons & UsAdlerBlack5424.69
13typewriter ribbon7Ribbons & UsAdlerBlack + Red2730.30

Mit dieser Tabelle können Sie mehrere Gruppen bilden. Sie können zum Beispiel den Durchschnittspreis eines Produkts nach der Schreibmaschinenmarke berechnen.

Hier ist die Abfrage, mit der das möglich ist:

SELECT typewriter_brand,
 AVG(price) AS average_price
FROM typewriter_products
GROUP BY typewriter_brand;

Diese Abfrage gruppiert Daten nach der Schreibmaschinenmarke und berechnet den Durchschnittspreis. Die Abfrage wird diese Tabelle ausgeben:

typewriter_brandaverage_price
Adler26.25
Olympia11.89
Underwood26.77

Die Ausgabe zeigt drei Typen von Schreibmaschinenmarken und den durchschnittlichen Produktpreis für jede Schreibmaschine.

Oder Sie können mit dieser Abfrage die Anzahl der verfügbaren Farbbänder nach Farbe ermitteln:

SELECT ribbon_color,
	 SUM(units) AS sum_units
FROM typewriter_products
GROUP BY ribbon_color;

Die Gruppe in dieser Abfrage ist die Farbbandfarbe. Ich verwende auch die Aggregatfunktion SUM(), um die Anzahl der Einheiten pro Farbbandfarbe zu summieren. Hier ist das Ergebnis:

ribbon_colorsum_units
Black508
Black + Red265

Die Daten sind in zwei Zeilen gruppiert: schwarzes Farbband und schwarzes + rotes Farbband. Für jede Farbbandfarbe gibt es eine Anzahl von Einheiten, die zum Verkauf stehen.

Dies ist ein kleiner Einblick in die Funktionsweise von GROUP BY. Wie Sie sehen können, ist die GROUP BY-Syntax relativ einfach. Wenn Sie weitere Erläuterungen zur GROUP BY-Syntax benötigen, lesen Sie diesen Artikel.

Wie können Sie Ihre eigenen Abfragen schreiben und die GROUP BY-Klausel verwenden? Hier sind einige Tipps, die Ihnen helfen.

Schritte zur Verwendung von GROUP BY

Wie verwendet man GROUP BY in SQL? In diesem Abschnitt gebe ich Ihnen eine Schritt-für-Schritt-Anleitung. Nehmen wir an, ich möchte die Anzahl der Datensätze für jedes Produkt ermitteln.

Der erste Schritt beim Schreiben einer Abfrage sollte darin bestehen, eine geeignete Gruppierungsspalte zu finden. In diesem Fall ist es product_id. Wir fügen diese Spalte in die GROUP BY-Klausel ein:

SELECT
…
GROUP BY product_id;

Der zweite Schritt besteht darin, die richtige Aggregatfunktion zu wählen und sie in der Anweisung SELECT zu verwenden. Da unser Ziel darin besteht, die Anzahl der Datensätze zu ermitteln, verwenden wir die Funktion COUNT(). Natürlich müssen Sie auch die Spalte in der FROM Klausel angeben:

SELECT COUNT(*)
FROM typewriter_products
GROUP BY product_id;

Wird diese Abfrage ausgeführt? Ja, natürlich! Sie wird diese Ausgabe zurückgeben.

count
2
2
1
2
2
2
2

Wie Sie sehen können, ist dies nicht sehr hilfreich. Alle Produkte haben zwei Datensätze, außer einem, aber um welche Produkte handelt es sich? Wir haben keinen Anhaltspunkt!

Deshalb ist der dritte Schritt so wichtig. In diesem Schritt schreiben Sie auch die Gruppierungsspalte in die SELECT:

SELECT product_id,
	 COUNT(*)
FROM typewriter_products
GROUP BY product_id
ORDER BY product_id; 

Jetzt wird die Abfrage diese Ausgabe zeigen.

product_idcount
12
22
32
41
52
62
72

Das ist doch viel hilfreicher, oder? Jetzt wissen Sie, dass das Produkt mit der ID 4 nur einmal in der Tabelle vorkommt. Sie haben wahrscheinlich bemerkt, dass ich in den obigen Abfragen COUNT(*) verwendet habe. Dies ist nicht die einzige Möglichkeit, diese Aggregatfunktion zu verwenden. Sie können sich auch über alle Möglichkeiten der Verwendung von COUNT() informieren .

Wenn Sie die beiden obigen Abfragen vergleichen, können Sie sehen, dass es möglich ist, eine Spalte in GROUP BY zu verwenden, sie aber nicht in SELECT zu verwenden; die Gruppierung funktioniert trotzdem.

Und was wäre, wenn Sie die Spalte in der SELECT-Anweisung, aber nicht in GROUP BY verwenden würden? Nein, das ist nicht möglich. Die allgemeine Regel lautet: Wenn die Spalte in SELECT steht und nicht in einer Aggregatfunktion verwendet wird, muss sie in derGROUP BY-Klausel aufgeführt werden. Hier finden Sie weitere Einzelheiten zu dieser Regel.

Weitere Tipps zur Verwendung von GROUP BY in SQL

Auch wenn die Verwendung von GROUP BY recht einfach zu sein scheint (und das ist es auch!), gibt es noch einige andere Tipps und Tricks, die die Verwendung dieser Klausel wesentlich angenehmer machen.

Verwenden Sie einen eindeutigen Bezeichner

Bei der Auswahl der Spalte, nach der gruppiert werden soll, sollten Sie im Allgemeinen die Spalte verwenden, die die Gruppe eindeutig identifiziert. Wenn Sie das nicht tun, kann das Ergebnis irreführend oder schlichtweg falsch sein.

Lassen Sie sich zum Beispiel die Produkte nach Schreibmaschinenmarke anzeigen, aber versuchen Sie, die Daten nach Produktnamen zu gruppieren. Die Abfrage ...

SELECT product_name,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_name, typewriter_brand
ORDER BY typewriter_brand;

... wird die folgende Tabelle ausgeben:

product_nametypewriter_brandproduct_count
typewriter ribbonAdler4
typewriter ribbonOlympia4
typewriter ribbonUnderwood5

Wenn Sie die Daten auf diese Weise gruppieren würden, entstünde der falsche Eindruck, dass es für jede der drei Schreibmaschinenmarken nur ein Produkt gibt - ein Produkt taucht viermal für Adler- und Olympia-Schreibmaschinen und fünfmal für Underwood-Schreibmaschinen auf.

Was wäre, wenn Sie die Spalte product_id anstelle von product_name verwenden würden?

SELECT product_id,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_id, typewriter_brand
ORDER BY typewriter_brand;

Jetzt sehen Sie, dass das Ergebnis ein wenig anders ist:

product_idtypewriter_brandproduct_count
6Adler2
7Adler2
1Olympia2
2Olympia2
3Underwood2
4Underwood1
5Underwood2

Es gibt immer noch Produkte für drei Schreibmaschinenmarken. Allerdings wissen Sie jetzt, dass es zwei Produkte für Adler und Olympia gibt, die beide zweimal für jede Schreibmaschine auftauchen. Für Underwood gibt es drei Produkte. Und nicht nur das, sondern Sie wissen auch, um welche Produkte es sich handelt.

Schauen wir uns dieses Beispiel an:

SELECT product_id,
	 product_name,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_id, product_name, typewriter_brand
ORDER BY typewriter_brand;

Dies ist eine erweiterte Version der vorherigen Abfrage. Wir gruppieren wieder nach product_id. Um die Anzahl der Produktvorkommen zu ermitteln, verwenden wir die Funktion COUNT(). Außerdem möchten wir weitere Bezeichnungen, also fügen wir den Produktnamen und die Schreibmaschinenmarke zum SELECT hinzu.

Da diese Spalten im SELECT erscheinen, müssen sie auch in GROUP BY erscheinen. Beachten Sie, dass dies bei allen Spalten der Fall ist, mit Ausnahme der Spalte mit der Aggregatfunktion.

Werfen Sie einen Blick auf die Ausgabe:

product_idproduct_nametypewriter_brandproduct_count
6typewriter ribbonAdler2
7typewriter ribbonAdler2
1typewriter ribbonOlympia2
2typewriter ribbonOlympia2
3typewriter ribbonUnderwood2
4typewriter ribbonUnderwood1
5typewriter ribbonUnderwood2

Sie können sehen, dass diese Ausgabe das klarste Bild vermittelt. Es gibt sieben verschiedene Produkte, aber es sind alles Farbbänder für Schreibmaschinen. Diese Produkte sind für drei Schreibmaschinenmarken. Alle Produkte kommen zweimal vor, außer Produkt Nr. 4.

Gruppierung nach Wert

Sie müssen nicht immer nach der ID-Spalte gruppieren. Es ist auch möglich, die Daten nach Wert zu gruppieren.

Wenn Sie z. B. wissen möchten, wie viele Einheiten es nach der Farbbandfarbe gibt, können Sie diese Abfrage verwenden:

SELECT ribbon_color,
	 SUM(units) AS units_sum
FROM typewriter_products
GROUP BY ribbon_color;

Hier verwenden wir die Farbe des Farbbands als Gruppierungskriterium. Die Aggregatfunktion SUM() summiert die Einheiten auf folgende Weise:

ribbon_colorunits_sum
Black508
Black + Red265

Die Ausgabe zeigt, dass es 508 schwarze Bänder und 265 schwarze und rote Bänder gibt.

Wenn Sie mit der Summierung der Werte nicht vertraut sind, sehen Sie sich die Erklärung der Funktion SUMME() an. Die Funktionen MIN() & MAX() werden auch häufig mit GROUP BY verwendet.

Zwei Spalten als Gruppendefinierer

Mit der GROUP BY-Klausel können Sie Daten nach zwei oder mehr Spalten gruppieren; das haben Sie bereits gesehen. Aber es ist auch möglich, zwei Spalten als eindeutigen Bezeichner einer Gruppe zu verwenden. Ein Beispiel:

SELECT ribbon_color,
	 typewriter_brand,
	 SUM(units) AS units_sum
FROM typewriter_products
GROUP BY ribbon_color, typewriter_brand
ORDER BY typewriter_brand;

In dieser Abfrage verwenden wir die Spalten ribbon_color und typewriter_brand, um eine Gruppe zu definieren. Jede Farbbandfarbe für eine bestimmte Schreibmaschine wird nur einmal angezeigt. Für eine so definierte Gruppe berechnen wir die Anzahl der verfügbaren Farbbänder:

ribbon_colortypewriter_brandunits_sum
BlackAdler98
Black + RedAdler43
BlackOlympia185
Black + RedOlympia195
BlackUnderwood225
Black + RedUnderwood27

Gruppierung nach einem Ausdruck

Anstatt nur nach Spalten zu gruppieren, ist es auch möglich, Daten nach einem Ausdruck zu gruppieren.

Schauen wir uns die folgende Abfrage an:

SELECT ribbon_brand,
	 ribbon_color,
	 units*price AS product_value,
 SUM(units*price) AS product_value_sum
FROM typewriter_products
GROUP BY ribbon_brand, ribbon_color, units*price
ORDER BY ribbon_brand;

Hier wählen wir die Marke und die Farbe des Farbbandes aus. Außerdem berechnen wir den Wert jeder Gruppe, indem wir die Einheit mit dem Preis multiplizieren.

Dann gruppieren wir die Daten nach den Spalten ribbon_brand und ribbon_color. Das ist etwas, was Sie schon gewohnt sind. Aber wir fügen auch die Formel zur Berechnung des Wertes in die GROUP BY-Klausel ein. Wir wollen nur eindeutige Werte nach Farbbandmarke und Farbe anzeigen. Wenn es mehrere gleiche berechnete Werte innerhalb derselben Gruppe gibt, werden sie als eine Zeile angezeigt.

Um die Aggregation deutlicher zu machen, habe ich die Summe der Produktwerte hinzugefügt. Sie werden bald sehen, warum.

ribbon_brandribbon_colorproduct_valueproduct_value_sum
All You NeedBlack346.36346.36
All You NeedBlack880.001,760.00
All You NeedBlack + Red327.21327.21
All You NeedBlack + Red480.00960.00
Our RibbonBlack1,350.001,350.00
Ribbons & UsBlack1,201.831,201.83
Ribbons & UsBlack1,333.261,333.26
Ribbons & UsBlack4,783.794,783.79
Ribbons & UsBlack + Red398.58398.58
Ribbons & UsBlack + Red818.10818.10
Ribbons & UsBlack + Red2,227.052,227.05

Es mag so aussehen, als sei diese Tabelle überhaupt nicht gruppiert. Aber sehen wir uns das mal genauer an. Wären die Daten nicht gruppiert, wäre die Marke All You Need sechsmal erschienen, genau wie Ribbons & Us. Sie taucht aber nur viermal auf. Und warum? Weil die Werte 880,00 und 480,00 jeweils zwei Mal vorkommen und deshalb gruppiert wurden.

Das zeigt Ihnen die Spalte product_value_sum in den farbigen Zeilen. Dies sind die einzigen Zeilen, in denen sich diese Spalte von product_value unterscheidet. Die grüne Zeile hat eine Summe von 1.760,00, weil der Wert 880,00 zweimal vorkommt. Die Summe der roten Zeile ist 960,00, weil 480,00 zweimal vorkommt.

Schritte zum Schreiben einer Abfrage mit GROUP BY und Aggregatfunktionen

Sie haben GROUP BY bereits durch das Schreiben aller oben genannten Abfragen verinnerlicht. Aber ich denke, es lohnt sich, dies als separate Liste aufzuführen - die Checkliste der Schritte.

  • Schritt 1: Identifizieren Sie die Gruppierungsspalte(n), d. h. eine oder mehrere Spalten, nach denen Sie die Daten gruppieren möchten. Nachdem Sie sie identifiziert haben, fügen Sie sie in die GROUP BY-Klausel ein.
  • Schritt 2: Wählen Sie je nach der zu berechnenden Metrik die entsprechende Aggregatfunktion und verwenden Sie sie in der SELECT-Anweisung.
  • Schritt 3 : Verwenden Sie die Gruppierungsspalte in der SELECT-Anweisung. Auf diese Weise erhalten Sie Datenbeschriftungen für jede Gruppe und nicht nur die Ausgabe der Aggregatfunktion.

Kein SQL-Benutzer kann die Verwendung von GROUP BY vermeiden

Kein mir bekannter SQL-Benutzer hat es geschafft, ein erfolgreiches SQL-Leben zu führen und Abfragen ohne GROUP BY zu schreiben. Das ist unmöglich! Warum also nicht GROUP BY und andere SQL-Ausdrücke und -Funktionen üben? Die kluge Wahl wäre unser SQL-Übungssatz. Es bietet Ihnen die Möglichkeit, alle in diesem Artikel behandelten Möglichkeiten der Verwendung von GROUP BY zu üben.

Einige weitere nützliche Ressourcen für GROUP BY-Beispiele finden Sie in unserem Blog; das Konzept taucht auch häufig in SQL-Interviewfragen auf.