Klausur-Tricks
Trick 1, Reihenfolge der Klauseln auswendig:
SELECT
FROM
WHERE -- vor GROUP BY (Zeilen)
GROUP BY
HAVING -- nach GROUP BY (Aggregate)
ORDER BY
Trick 2, SELECT-Regel: nur GROUP BY-Spalten ODER Aggregate. Klausur prüft das gerne mit Trickfragen.
Trick 3, COUNT(*) vs COUNT(spalte):
- COUNT(*) = alle Zeilen
- COUNT(email) = Zeilen mit nicht-NULL email
- COUNT(DISTINCT kunde) = unterschiedliche Kunden
Trick 4, AVG bei NULLs: ignoriert NULLs. AVG(note) über 10 Studis wo 2 keine Note haben → Mittelwert über 8 Werte.
Trick 5, HAVING ohne GROUP BY: technisch erlaubt, dann gilt die ganze Tabelle als eine Gruppe. Selten gebraucht.
Trick 6, ORDER BY mit Aggregat:
SELECT kunde, SUM(betrag)
FROM verkaeufe
GROUP BY kunde
ORDER BY SUM(betrag) DESC; -- Top-Kunden zuerst
Trick 7, DISTINCT vs GROUP BY: für reines "unterschiedliche Werte zeigen" liefern beide dasselbe Ergebnis:
SELECT DISTINCT kategorie FROM verkaeufe;
SELECT kategorie FROM verkaeufe GROUP BY kategorie;
-- gleicher Output
Die interne Optimierung ist DB-abhängig (manche DBs planen identisch, andere nicht). GROUP BY ist mächtiger, sobald Aggregate dazukommen.
Trick 8, Alias in HAVING (dialektabhängig):
SELECT kunde, SUM(betrag) AS total
FROM verkaeufe
GROUP BY kunde
HAVING total > 1000;
-- ✅ MySQL / SQLite: erlaubt
-- ❌ PostgreSQL und Standard-SQL: nicht erlaubt (Alias erst nach SELECT verfügbar)
Sicherer Standard (in allen DBs):
HAVING SUM(betrag) > 1000;
Trick 9, Leere Ergebnismenge: COUNT(*) → 0, SUM/AVG/MIN/MAX → NULL (Standard-SQL, auch PostgreSQL und SQLite). Wenn 0 statt NULL gewünscht ist: COALESCE(SUM(betrag), 0) benutzen. (Nur SQLites total() liefert direkt 0.0 statt NULL, sum() hingegen NULL.)
Trick 10, GROUPING SETS / ROLLUP / CUBE: erweiterte Gruppierungen für Reporting (Master-Stoff). Erstmal ignorieren.
Wo brauchst du GROUP BY?
- Reports / Dashboards: Umsatz pro Monat, User pro Region
- Statistiken: Durchschnittsnote pro Klausur, Anzahl Bestellungen pro Kunde
- Data Warehouses: jedes BI-Tool macht GROUP BY im Hintergrund
- Web-Analytics: Pageviews pro URL, Sessions pro Browser
- Logs analysieren: Fehler pro Stunde, Status-Codes pro Endpoint
Faustregel: wenn die Frage "wieviel/wieviele/durchschnittlich pro X" lautet → GROUP BY.