Alles, was Sie über die SQL GROUP BY-Anweisung wissen müssen

Alles, was Sie über die SQL GROUP BY-Anweisung wissen müssen

Ein Großteil der Leistungsfähigkeit relationaler Datenbanken beruht auf dem Filtern von Daten und dem Zusammenführen von Tabellen. Deshalb vertreten wir diese Beziehungen in erster Linie. Moderne Datenbanksysteme bieten jedoch noch eine weitere wertvolle Technik: das Gruppieren.





Durch die Gruppierung können Sie zusammenfassende Informationen aus einer Datenbank extrahieren. Sie können Ergebnisse kombinieren, um nützliche statistische Daten zu erstellen. Die Gruppierung erspart Ihnen das Schreiben von Code für häufige Fälle, wie z. B. die Mittelwertbildung von Zahlenlisten. Und es kann zu effizienteren Systemen führen.





Was macht die GROUP BY-Klausel?

GROUP BY, wie der Name schon sagt, gruppiert Ergebnisse zu einer kleineren Menge. Die Ergebnisse bestehen aus einer Zeile für jeden eindeutigen Wert der gruppierten Spalte. Wir können seine Verwendung zeigen, indem wir uns einige Beispieldaten mit Zeilen ansehen, die einige gemeinsame Werte aufweisen.





Filme kostenlos online ansehen, ohne sich anzumelden

Das Folgende ist eine sehr einfache Datenbank mit zwei Tabellen, die Schallplatten darstellen. Sie können eine solche Datenbank einrichten, indem Sie ein grundlegendes Schema schreiben für das von Ihnen gewählte Datenbanksystem. Die Alben Tabelle hat neun Zeilen mit einem Primärschlüssel Ich würde Spalte und Spalten für Name, Künstler, Erscheinungsjahr und Verkauf:

+----+---------------------------+-----------+--------------+-------+
| id | name | artist_id | release_year | sales |
+----+---------------------------+-----------+--------------+-------+
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | The Dark Side of the Moon | 2 | 1973 | 24 |
| 3 | Rumours | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Animals | 2 | 1977 | 6 |
| 6 | Goodbye Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Bat Out of Hell | 7 | 1977 | 28 |
+----+---------------------------+-----------+--------------+-------+

Die Künstler Tabelle ist noch einfacher. Es hat sieben Zeilen mit id- und name-Spalten:



+----+---------------+
| id | name |
+----+---------------+
| 1 | The Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Meat Loaf |
+----+---------------+

Mit einem einfachen Datensatz wie diesem können Sie verschiedene Aspekte von GROUP BY verstehen. Natürlich hätte ein realer Datensatz viele, viel mehr Zeilen, aber die Prinzipien bleiben gleich.

Gruppieren nach einer einzelnen Spalte

Nehmen wir an, wir möchten herausfinden, wie viele Alben wir für jeden Künstler haben. Beginnen Sie mit einem typischen AUSWÄHLEN Abfrage zum Abrufen der Spalte artist_id:





SELECT artist_id FROM albums

Dies gibt wie erwartet alle neun Zeilen zurück:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 2 |
| 5 |
| 6 |
| 6 |
| 7 |
+-----------+

Um diese Ergebnisse nach dem Künstler zu gruppieren, fügen Sie den Satz an GRUPPE NACH Künstler_ID :





SELECT artist_id FROM albums GROUP BY artist_id

Was folgende Ergebnisse liefert:

+-----------+
| artist_id |
+-----------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+-----------+

Es gibt sieben Zeilen in der Ergebnismenge, reduziert von den insgesamt neun im Alben Tisch. Jedes Unikat artist_id hat eine einzelne Zeile. Um die tatsächlichen Zählerstände zu erhalten, fügen Sie schließlich hinzu ZÄHLEN(*) zu den ausgewählten Spalten:

SELECT artist_id, COUNT(*)
FROM albums
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
+-----------+----------+

Die Ergebnisse gruppieren zwei Reihenpaare für die Künstler mit IDs 2 und 6 . Jeder hat zwei Alben in unserer Datenbank.

Verwandt: Der Spickzettel für grundlegende SQL-Befehle für Anfänger

Zugriff auf gruppierte Daten mit einer Aggregatfunktion

Sie haben vielleicht die ZÄHLEN Funktion vor, vor allem in der ZÄHLEN(*) Form wie oben zu sehen. Es ruft die Anzahl der Ergebnisse in einem Satz ab. Sie können es verwenden, um die Gesamtzahl der Datensätze in einer Tabelle abzurufen:

SELECT COUNT(*) FROM albums
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+

COUNT ist eine Aggregatfunktion. Dieser Begriff bezieht sich auf Funktionen, die Werte aus mehreren Zeilen in einen einzigen Wert übersetzen. Sie werden oft in Verbindung mit der GROUP BY-Anweisung verwendet.

Anstatt nur die Anzahl der Zeilen zu zählen, können wir eine Aggregatfunktion auf gruppierte Werte anwenden:

SELECT artist_id, SUM(sales)
FROM albums
GROUP BY artist_id
+-----------+------------+
| artist_id | SUM(sales) |
+-----------+------------+
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+-----------+------------+

Die oben gezeigten Gesamtverkäufe für die Künstler 2 und 6 sind die Verkäufe ihrer mehreren Alben zusammen:

SELECT artist_id, sales
FROM albums
WHERE artist_id IN (2, 6)
+-----------+-------+
| artist_id | sales |
+-----------+-------+
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+-----------+-------+

Gruppieren nach mehreren Spalten

Sie können nach mehr als einer Spalte gruppieren. Fügen Sie einfach mehrere Spalten oder Ausdrücke ein, die durch Kommas getrennt sind. Die Ergebnisse werden entsprechend der Kombination dieser Spalten gruppiert.

SELECT release_year, sales, count(*)
FROM albums
GROUP BY release_year, sales

Dies führt in der Regel zu mehr Ergebnissen als die Gruppierung nach einer einzelnen Spalte:

+--------------+-------+----------+
| release_year | sales | count(*) |
+--------------+-------+----------+
| 1969 | 14 | 1 |
| 1973 | 24 | 1 |
| 1977 | 28 | 2 |
| 1991 | 17 | 1 |
| 1977 | 6 | 1 |
| 1973 | 8 | 1 |
| 2011 | 25 | 1 |
| 2015 | 22 | 1 |
+--------------+-------+----------+

Beachten Sie, dass in unserem kleinen Beispiel nur zwei Alben das gleiche Erscheinungsjahr und die gleiche Verkaufszahl haben (28 im Jahr 1977).

Nützliche Aggregatfunktionen

Abgesehen von COUNT funktionieren mehrere Funktionen gut mit GROUP. Jede Funktion gibt einen Wert zurück, der auf den Datensätzen basiert, die zu jeder Ergebnisgruppe gehören.

  • COUNT() gibt die Gesamtzahl der übereinstimmenden Datensätze zurück.
  • SUM() gibt die Summe aller Werte in der angegebenen Spalte addiert zurück.
  • MIN() gibt den kleinsten Wert in einer gegebenen Spalte zurück.
  • MAX() gibt den größten Wert in einer bestimmten Spalte zurück.
  • AVG() gibt den Mittelwert zurück. Es ist das Äquivalent von SUM() / COUNT().

Sie können diese Funktionen auch ohne eine GROUP-Klausel verwenden:

Realtek-Lautsprecher funktionieren nicht Windows 10
SELECT AVG(sales) FROM albums
+------------+
| AVG(sales) |
+------------+
| 19.1111 |
+------------+

Verwenden von GROUP BY mit einer WHERE-Klausel

Wie bei einem normalen SELECT können Sie weiterhin WHERE verwenden, um die Ergebnismenge zu filtern:

SELECT artist_id, COUNT(*)
FROM albums
WHERE release_year > 1990
GROUP BY artist_id
+-----------+----------+
| artist_id | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 6 | 2 |
+-----------+----------+

Jetzt haben Sie nur noch die Alben, die nach 1990 veröffentlicht wurden, gruppiert nach Künstlern. Sie können auch unabhängig von GROUP BY einen Join mit der WHERE-Klausel verwenden:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
+---------+--------+
| name | albums |
+---------+--------+
| Nirvana | 1 |
| Adele | 2 |
+---------+--------+

Beachten Sie jedoch Folgendes, wenn Sie versuchen, basierend auf einer aggregierten Spalte zu filtern:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND albums > 2
GROUP BY artist_id;

Sie erhalten einen Fehler:

ERROR 1054 (42S22): Unknown column 'albums' in 'where clause'

Auf aggregierten Daten basierende Spalten sind für die WHERE-Klausel nicht verfügbar.

Verwendung der HAVING-Klausel

Wie filtern Sie also die Ergebnismenge, nachdem eine Gruppierung stattgefunden hat? Die HABEN Klausel befasst sich mit diesem Bedürfnis:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;

Beachten Sie, dass die HAVING-Klausel nach GROUP BY steht. Ansonsten ist es im Wesentlichen ein einfacher Ersatz des WHERE durch HAVING. Die Ergebnisse sind:

+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+

Sie können weiterhin eine WHERE-Bedingung verwenden, um die Ergebnisse vor der Gruppierung zu filtern. Es funktioniert zusammen mit einer HAVING-Klausel zum Filtern nach der Gruppierung:

SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;

Nur ein Künstler in unserer Datenbank hat nach 1990 mehr als ein Album veröffentlicht:

+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+

Kombinieren von Ergebnissen mit GROUP BY

Die GROUP BY-Anweisung ist ein unglaublich nützlicher Teil der SQL-Sprache. Es kann zusammenfassende Informationen von Daten, zum Beispiel für eine Inhaltsseite, bereitstellen. Es ist eine hervorragende Alternative zum Abrufen großer Datenmengen. Die Datenbank verarbeitet diese zusätzliche Arbeitslast gut, da sie aufgrund ihres Designs optimal für den Job geeignet ist.

Sobald Sie die Gruppierung und das Verknüpfen mehrerer Tabellen verstanden haben, können Sie die Leistungsfähigkeit einer relationalen Datenbank weitgehend nutzen.

Teilen Teilen Tweet Email So fragen Sie mehrere Datenbanktabellen gleichzeitig mit SQL-Joins ab

Erfahren Sie, wie Sie SQL-Joins verwenden, um Abfragen zu rationalisieren, Zeit zu sparen und sich wie ein SQL-Power-User zu fühlen.

wann kam die erste ps4 raus
Weiter lesen Verwandte Themen
  • Programmierung
  • SQL
Über den Autor Bobby Jack(58 veröffentlichte Artikel)

Bobby ist ein Technologie-Enthusiast, der fast zwei Jahrzehnte lang als Software-Entwickler gearbeitet hat. Er hat eine Leidenschaft für Spiele, arbeitet als Rezensionsredakteur beim Switch Player Magazine und vertieft sich in alle Aspekte des Online-Publishing und der Webentwicklung.

Mehr von Bobby Jack

Abonniere unseren Newsletter

Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!

Klicken Sie hier, um zu abonnieren