Level 8: Gruppen mit HAVING filtern
Aktualisiert am
Mittelstufe · Level 8 von 20. Ziel: Nur die Gruppen behalten, die eine Bedingung auf einem Aggregat erfüllen.
Themen: HAVING WHERE oder HAVING
Lektion
Sind die Pakete durch GROUP BY gebildet, will man manchmal nur einige davon behalten: die Verkäufer mit einem Umsatz über 1200, die Abteilungen mit mehr als 2 Personen. Dieser Filter betrifft ein Aggregat, das erst nach der Gruppierung existiert.
WHERE kann das nicht: Es wirkt vor der Gruppierung, Zeile für Zeile, wenn die Summen noch nicht berechnet sind. WHERE SUM(amount) > 1200 führt daher zu einem Fehler. HAVING ist das WHERE der Gruppen: Es wird nach GROUP BY ausgeführt und prüft die Aggregate.
HAVING steht direkt nach GROUP BY: GROUP BY seller HAVING SUM(amount) > 1200. Bei den Verkäufen fallen Ana (1150) und Dan (900) weg, Ben (1450) und Cleo (1550) bleiben. Das geprüfte Aggregat muss nicht im SELECT angezeigt werden.
WHERE und HAVING lassen sich kombinieren: WHERE wählt die Zeilen, die in die Berechnung eingehen, HAVING wählt die Gruppen, die herauskommen. Mit WHERE region = 'North' … GROUP BY seller HAVING SUM(amount) > 1200 werden die Summen nur über die Verkäufe im Norden berechnet, dann bleiben nur die großen Summen übrig.
Faustregel: Eine Bedingung auf eine gewöhnliche Spalte gehört ins WHERE, eine Bedingung auf ein Aggregat ins HAVING.
Vollständige Ausführungsreihenfolge: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT. Behalte sie im Kopf: Sie erklärt, wo jeder Filter stehen darf.
Syntax
SELECT spalte, AGG(x)
FROM meine_tabelle
WHERE …
GROUP BY spalte
HAVING AGG(x) > wert;Kommentiertes Beispiel
SELECT seller, SUM(amount) AS total
FROM sales
GROUP BY seller
HAVING SUM(amount) > 1200;Wir berechnen die Summe jedes Verkäufers und behalten nur die über 1200.
| id | seller | region | month | amount |
|---|---|---|---|---|
| 1 | Ana | North | 2025-01 | 300 |
| 2 | Ana | North | 2025-02 | 450 |
| 3 | Ana | North | 2025-03 | 400 |
| 4 | Ben | North | 2025-01 | 500 |
| 5 | Ben | North | 2025-02 | 350 |
| 6 | Ben | North | 2025-03 | 600 |
| 7 | Cleo | South | 2025-01 | 200 |
| 8 | Cleo | South | 2025-02 | 700 |
| 9 | Cleo | South | 2025-03 | 650 |
| 10 | Dan | South | 2025-01 | 400 |
| 11 | Dan | South | 2025-02 | 400 |
| 12 | Dan | South | 2025-03 | 100 |
Ergebnis des Beispiels
| seller | total |
|---|---|
| Ben | 1450 |
| Cleo | 1550 |
Das Wichtigste
- WHERE: Bedingung auf Zeilen. HAVING: Bedingung auf Gruppen.
- HAVING steht nach GROUP BY.
- Ein Aggregat in einer Bedingung gehört in HAVING.
Häufige Fallen
- WHERE COUNT(*) > 2 erzeugt einen Fehler: Richtig ist HAVING COUNT(*) > 2.
- Eine Bedingung auf eine nicht gruppierte Spalte (GROUP BY seller HAVING month = '2025-01') ist im Standard-SQL ein Fehler. SQLite akzeptiert sie, prüft aber nur eine beliebige Zeile der Gruppe: Setze sie ins WHERE. Bei einer Spalte aus dem GROUP BY ist sie im HAVING erlaubt, im WHERE aber klarer und schneller.
Die 5 Übungen des Levels
- Zeige die Abteilungen mit mehr als 2 Mitarbeitenden, mit ihrer Mitarbeiterzahl.
- Zeige die Fächer mit einem Notendurchschnitt von mindestens 12.5, mit diesem Durchschnitt.
- Zeige die ID der Mitglieder mit mindestens 3 Ausleihen, mit ihrer Zahl an Ausleihen.
- Zeige, nur für Flüge unter 120 Minuten, die Fluggesellschaften, die mehr als 300 Plätze verkauft haben, mit ihrer Summe.
- Zeige die Künstler (artist_id), deren Songs im Schnitt länger als 240 Sekunden sind, mit diesem Durchschnitt, vom längsten zum kürzesten.
In SpeedQL wird jede Abfrage sofort geprüft: Ihr Ergebnis wird mit dem erwarteten verglichen, dann läuft die Abfrage noch einmal auf einer versteckten Kontrolldatenbank. Zu jeder Übung gibt es schriftliche Hinweise, die du nur bei Bedarf aufrufst.
Die Übungen von Level 8 machen
Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.
← Vorheriges Level: Gruppieren mit GROUP BY · Nächstes Level: Zwei Tabellen mit JOIN verbinden →