Level 8: Gruppen mit HAVING filtern

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.

Tabelle sales (12 Zeilen)
idsellerregionmonthamount
1AnaNorth2025-01300
2AnaNorth2025-02450
3AnaNorth2025-03400
4BenNorth2025-01500
5BenNorth2025-02350
6BenNorth2025-03600
7CleoSouth2025-01200
8CleoSouth2025-02700
9CleoSouth2025-03650
10DanSouth2025-01400
11DanSouth2025-02400
12DanSouth2025-03100

Ergebnis des Beispiels

sellertotal
Ben1450
Cleo1550

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

  1. Geführt · Zeige die Abteilungen mit mehr als 2 Mitarbeitenden, mit ihrer Mitarbeiterzahl. (Tabelle: staff)
  2. Training · Zeige die Fächer mit einem Notendurchschnitt von mindestens 12.5, mit diesem Durchschnitt. (Tabelle: grades)
  3. Training · Zeige die ID der Mitglieder mit mindestens 3 Ausleihen, mit ihrer Zahl an Ausleihen. (Tabelle: loans)
  4. Training · Zeige, nur für Flüge unter 120 Minuten, die Fluggesellschaften, die mehr als 300 Plätze verkauft haben, mit ihrer Summe. (Tabelle: flights)
  5. Herausforderung · 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. (Tabelle: songs)

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.

Level 8 in SpeedQL öffnen

·