Ein Großteil der Leistung relationaler Datenbanken beruht auf dem Filtern von Daten und dem Zusammenfügen von Tabellen. Deshalb vertreten wir diese Beziehungen in erster Linie. Moderne Datenbanksysteme bieten jedoch eine weitere wertvolle Technik: die Gruppierung.

Durch Gruppieren können Sie zusammenfassende Informationen aus einer Datenbank extrahieren. Sie können die Ergebnisse kombinieren, um nützliche statistische Daten zu erstellen. Durch die Gruppierung können Sie keinen Code für häufige Fälle schreiben, z. B. für die Mittelung von Zahlenlisten. Und es kann zu effizienteren Systemen führen.

Was macht die GROUP BY-Klausel?

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

Das Folgende ist eine sehr einfache Datenbank mit zwei Tabellen, die Plattenalben darstellen. Sie können eine solche Datenbank einrichten, indem Sie

instagram viewer
Schreiben eines Grundschemas für das von Ihnen gewählte Datenbanksystem. Das 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 | Vertrieb |
++++++
| 1 | Abbey Road | 1 | 1969 | 14 |
| 2 | Die dunkle Seite des Mondes 2 | 1973 | 24 |
| 3 | Gerüchte | 3 | 1977 | 28 |
| 4 | Nevermind | 4 | 1991 | 17 |
| 5 | Tiere | 2 | 1977 | 6 |
| 6 | Auf Wiedersehen Yellow Brick Road | 5 | 1973 | 8 |
| 7 | 21 | 6 | 2011 | 25 |
| 8 | 25 | 6 | 2015 | 22 |
| 9 | Fledermaus aus der Hölle | 7 | 1977 | 28 |
++++++

Das Künstler Tisch ist noch einfacher. Es hat sieben Zeilen mit ID- und Namensspalten:

+++
| id | Name |
+++
| 1 | Die Beatles |
| 2 | Pink Floyd |
| 3 | Fleetwood Mac |
| 4 | Nirvana |
| 5 | Elton John |
| 6 | Adele |
| 7 | Hackbraten |
+++

Mit nur einem einfachen Datensatz wie diesem können Sie verschiedene Aspekte von GROUP BY verstehen. Natürlich würde ein realer Datensatz viele, viel mehr Zeilen enthalten, aber die Prinzipien bleiben dieselben.

Gruppierung 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 WÄHLEN Abfrage zum Abrufen der Spalte artist_id:

SELECT artist_id FROM Alben

Dies gibt erwartungsgemäß alle neun Zeilen zurück:

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

Fügen Sie den Satz hinzu, um diese Ergebnisse nach Künstler zu gruppieren GROUP BY artist_id:

SELECT artist_id FROM Alben GROUP BY artist_id

Welches ergibt die folgenden Ergebnisse:

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

Die Ergebnismenge enthält sieben Zeilen, die von den insgesamt neun Zeilen in der Ergebnismenge reduziert wurden Alben Tabelle. Jedes einzigartig artist_id hat eine einzelne Zeile. Fügen Sie schließlich hinzu, um die tatsächlichen Zählungen zu erhalten ANZAHL(*) zu den ausgewählten Spalten:

SELECT artist_id, COUNT (*)
VON Alben
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 Zeilenpaare für die Künstler mit IDs 2 und 6. Jedes hat zwei Alben in unserer Datenbank.

Verbunden: Das Essential SQL Commands Cheat Sheet für Anfänger

Zugriff auf gruppierte Daten mit einer Aggregatfunktion

Möglicherweise haben Sie die verwendet ANZAHL Funktion vor, vor allem in der ANZAHL(*) Form wie oben gesehen. 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 Alben
++
| COUNT (*) |
++
| 9 |
++

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

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

SELECT artist_id, SUM (Verkauf)
VON Alben
GROUP BY artist_id
+++
| artist_id | SUMME (Verkauf) |
+++
| 1 | 14 |
| 2 | 30 |
| 3 | 28 |
| 4 | 17 |
| 5 | 8 |
| 6 | 47 |
| 7 | 28 |
+++

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

SELECT artist_id, sales
VON Alben
WO artist_id IN (2, 6)
+++
| artist_id | Vertrieb |
+++
| 2 | 24 |
| 2 | 6 |
| 6 | 25 |
| 6 | 22 |
+++

Gruppierung 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 nach der Kombination dieser Spalten gruppiert.

SELECT release_year, sales, count (*)
VON Alben
GROUP BY release_year, Umsatz

Dies führt normalerweise zu mehr Ergebnissen als die Gruppierung nach einer einzelnen Spalte:

++++
| release_year | Vertrieb | 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 bestimmten Spalte zurück.
  • MAX () gibt den größten Wert in einer bestimmten Spalte zurück.
  • AVG () gibt den mittleren Durchschnitt zurück. Dies entspricht SUM () / COUNT ().

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

SELECT AVG (Verkäufe) AUS Alben
++
| AVG (Vertrieb) |
++
| 19.1111 |
++

Verwenden von GROUP BY mit einer WHERE-Klausel

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

SELECT artist_id, COUNT (*)
VON Alben
WHERE release_year> 1990
GROUP BY artist_id
+++
| artist_id | COUNT (*) |
+++
| 4 | 1 |
| 6 | 2 |
+++

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

SELECT r.name, COUNT (*) AS-Alben
AUS Alben l, Künstler r
WO artist_id = r.id.
AND release_year> 1990
GROUP BY artist_id
+++
| Name | Alben |
+++
| Nirvana | 1 |
| Adele | 2 |
+++

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

SELECT r.name, COUNT (*) AS-Alben
AUS Alben l, Künstler r
WO artist_id = r.id.
UND Alben> 2
GROUP BY artist_id;

Sie erhalten eine Fehlermeldung:

FEHLER 1054 (42S22): Unbekannte Spalte 'Alben' in 'where-Klausel'

Spalten, die auf aggregierten Daten basieren, stehen der WHERE-Klausel nicht zur Verfügung.

Verwenden der HAVING-Klausel

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

SELECT r.name, COUNT (*) AS-Alben
AUS Alben l, Künstler r
WO artist_id = r.id.
GROUP BY artist_id
HABEN Alben> 1;

Beachten Sie, dass die HAVING-Klausel nach GROUP BY steht. Ansonsten handelt es sich im Wesentlichen um einen einfachen Ersatz des WHERE durch HAVING. Die Ergebnisse sind:

+++
| Name | Alben |
+++
| 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-Alben
AUS Alben l, Künstler r
WO artist_id = r.id.
AND release_year> 1990
GROUP BY artist_id
HABEN Alben> 1;

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

+++
| Name | Alben |
+++
| Adele | 2 |
+++

Ergebnisse mit GROUP BY kombinieren

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

Sobald Sie die Gruppierung und das Verknüpfen mehrerer Tabellen verstanden haben, können Sie den größten Teil der Leistung einer relationalen Datenbank nutzen.

Email
Abfragen mehrerer Datenbanktabellen gleichzeitig mit SQL-Verknüpfungen

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

Verwandte Themen
  • Programmierung
  • SQL
Über den Autor
Bobby Jack (28 Artikel veröffentlicht)

Bobby ist ein Technologie-Enthusiast, der fast zwei Jahrzehnte als Softwareentwickler gearbeitet hat. Er liebt das Spielen, arbeitet als Reviews Editor beim Switch Player Magazine und ist in alle Aspekte des Online-Publizierens und der Webentwicklung vertieft.

Mehr von Bobby Jack

Abonniere unseren Newsletter

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

Noch ein Schritt…!

Bitte bestätigen Sie Ihre E-Mail-Adresse in der E-Mail, die wir Ihnen gerade gesendet haben.

.