Stell dir vor, du arbeitest mit tausenden Datenzeilen – wie findest du darin den Durchblick? Hier kommt der GROUP BY Operator ins Spiel – der wahre Dirigent im SQL-Orchester. Er nimmt verstreute Daten und macht daraus eine klare Melodie: zählt, gruppiert, zieht Bilanz. Willst du wissen, wie viele Bestellungen jeder Kunde gemacht hat, wie viele Studierende es pro Kurs gibt oder wie sich Gehälter auf Abteilungen verteilen? All das ist GROUP BY-Magie. Heute schauen wir uns an, wie du damit richtig umgehst und das Maximum aus deinen Tabellen rausholst.
Gruppierung ist der Prozess, bei dem Zeilen, die in einer oder mehreren Spalten gleiche Werte haben, zu logischen Gruppen zusammengefasst werden. So kannst du Aggregatfunktionen auf jede Gruppe einzeln anwenden.
Stell dir vor, du hast eine Mitarbeitertabelle und willst das Durchschnittsgehalt pro Abteilung wissen. Eine Abteilung – eine Gruppe. SQL nutzt GROUP BY, um die Mitarbeitertabelle nach Abteilungen zu gruppieren und dann AVG() auf jede Gruppe anzuwenden.
Syntax von GROUP BY
Die wichtigste Regel beim Gruppieren in SQL: Wenn du GROUP BY benutzt, muss jede Spalte, die nicht Teil einer Aggregatfunktion ist, im GROUP BY stehen.
Syntax:
SELECT spalte1,
aggregatfunktion(spalte2)
FROM tabelle
GROUP BY spalte1;
Schritte:
- Gib die Spalte an, nach der du gruppieren willst, im
GROUP BYan. - Nutze Aggregatfunktionen, um Werte in den Gruppen zu berechnen.
- Alle Spalten im
SELECT, die nicht in Aggregatfunktionen stecken, müssen imGROUP BYstehen. Ja, SQL ist da streng – vergisst du das, gibt’s eine Fehlermeldung.
Beispiel: Studierende nach Fakultäten gruppieren
Nehmen wir an, wir haben eine Tabelle students, die Infos über Studierende speichert:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Jetzt wollen wir den Durchschnitts-GPA pro Fakultät wissen. Dafür schreiben wir eine Query mit GROUP BY:
SELECT faculty, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Ergebnis:
| faculty | avg_gpa |
|---|---|
| ComputerSci | 3.9 |
| Math | 3.7 |
| Physics | 3.7 |
SQL hat die Daten zuerst nach faculty gruppiert und dann AVG() auf jede Gruppe angewendet.
Besonderheiten bei GROUP BY
- Anforderungen an Spalten im
SELECT
SQL verlangt, dass alle Spalten, die du im SELECT hast, aber nicht in Aggregatfunktionen stecken (wie SUM(), COUNT()), auch im GROUP BY stehen. Sonst weiß SQL nicht, welche Werte es anzeigen soll.
Probier mal diese Query – du bekommst einen Fehler:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty;
Fehler: Spalte name ist nicht im GROUP BY angegeben. Um das zu fixen, füge name zu GROUP BY hinzu:
SELECT name, AVG(gpa)
FROM students
GROUP BY faculty, name;
Aber das gruppiert die Daten schon auf Ebene einzelner Studierender – nicht ganz das, was wir ursprünglich wollten.
- Gruppierung nach mehreren Spalten
Du kannst nicht nur nach einer, sondern nach mehreren Spalten gruppieren. Zum Beispiel wollen wir zusätzlich zu den Fakultäten auch nach Namen gruppieren. Einfach die zweite Spalte ins GROUP BY packen:
SELECT faculty, name, AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty, name;
Ursprüngliche Tabelle:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Ergebnis:
| faculty | name | avg_gpa |
|---|---|---|
| ComputerSci | Alex Lin | 3.8 |
| ComputerSci | Anna Song | 4.0 |
| Math | Maria Chi | 3.5 |
| Math | Otto Art | 3.9 |
| Physics | Liam Park | 3.7 |
- Gruppierung mit mehreren Aggregatfunktionen
Du musst dich nicht auf eine Funktion beschränken! Zum Beispiel wollen wir die Anzahl der Studierenden pro Fakultät zählen und den Durchschnitts-GPA berechnen:
SELECT faculty,
COUNT(*) AS student_count,
AVG(gpa) AS avg_gpa
FROM students
GROUP BY faculty;
Ausgangstabelle:
| id | name | faculty | gpa |
|---|---|---|---|
| 1 | Alex Lin | ComputerSci | 3.8 |
| 2 | Maria Chi | Math | 3.5 |
| 3 | Anna Song | ComputerSci | 4.0 |
| 4 | Otto Art | Math | 3.9 |
| 5 | Liam Park | Physics | 3.7 |
Ergebnis:
| faculty | student_count | avg_gpa |
|---|---|---|
| ComputerSci | 2 | 3.9 |
| Math | 2 | 3.7 |
| Physics | 1 | 3.7 |
Besonderheiten der Gruppierung in SQL: Was geht und was nicht
GROUP BY-Queries zu schreiben ist easy, aber wahrscheinlich funktioniert die Hälfte deiner ersten Versuche nicht. Gruppierung läuft ein bisschen anders, als man es sich im Kopf vorstellt.
Wenn du in deiner SQL-Query ein GROUP BY hast, denk an alle Spalten im Ergebnis als berechnete Ausdrücke. Spalten im SELECT dürfen nur zwei Typen sein:
- werden durch Aggregatfunktionen auf Basis der Gruppenspalten berechnet.
- kommen aus GROUP BY – nach denen wird gruppiert.
Wenn du eine GROUP BY-Query auf die Studierendentabelle machst, kannst du im Ergebnis keine einzelnen Studierenden haben! Du kannst den Durchschnitts-GPA, die durchschnittliche Größe, das Durchschnittsgewicht haben. Aber so ein Code funktioniert nicht:
SELECT faculty, name
FROM students
GROUP BY faculty;
Schauen wir mal, warum das so ist.
Der Operator GROUP BY faculty teilt die Studierenden aus der Tabelle students in Gruppen mit gleichem faculty auf. Da alle in einer Gruppe das gleiche faculty haben, kann man sagen, dass die Gruppe das Attribut faculty hat. Aber name ist bei allen unterschiedlich. Also gibt es kein gemeinsames name für die Gruppe.
Der Operator GROUP BY faculty, gender teilt die Studierenden in Gruppen mit gleichem faculty und gender auf. Also haben alle in einer Gruppe das gleiche faculty und gender. Die Gruppe hat also die Attribute faculty und gender. Aber ein gemeinsames name gibt es immer noch nicht.
So kannst du es machen:
SELECT faculty, gender
FROM students
GROUP BY faculty, gender;
Oder sogar so:
SELECT
faculty,
gender,
AVG(age) as group_avg_age, -- Wert wird auf Basis der age-Werte der Gruppe berechnet
MAX(high) as group_high -- Wert wird auf Basis der high-Werte der Gruppe berechnet
FROM students
GROUP BY faculty, gender;
Aber einfach age und high im SELECT zu benutzen, geht in unserem Fall nicht.
Typische Fehler bei GROUP BY
Wenn du anfängst, GROUP BY-Queries zu schreiben, hier ein paar Stolpersteine, die dir begegnen können:
Nicht alle Spalten im
SELECTangegeben. Denk dran: Jede Spalte, die kein Aggregat ist, muss imGROUP BYstehen. Sonst weiß SQL nicht, wie sie angezeigt werden soll.Gruppierung nach
NULL.NULL-Werte werden als eigene Gruppe behandelt. Wenn deine SpalteNULLenthält, macht SQL eine Gruppe fürNULL.Zu viele Gruppen. Wenn du aus Versehen zu viele Spalten ins
GROUP BYpackst, bekommst du zu detaillierte Ergebnisse, die schwerer zu analysieren sind.
Jetzt weißt du, wie du Daten mit GROUP BY effektiv gruppierst. Das ist eines der mächtigsten Tools in SQL, mit dem du easy mit aggregierten Daten arbeiten und strukturierte Reports bauen kannst. Als nächstes tauchen wir noch tiefer in die Gruppierungs-Magie ein und schauen, wie du mit HAVING zusätzliche Filter setzt.
GO TO FULL VERSION