🪜Logische Ausführungsreihenfolge
SQL wird mit SELECT begonnen, aber nicht mit SELECT ausgeführt. Der Debugger zeigt nach jeder Stufe die Zwischentabelle – verworfene Zeilen, aufgefüllte NULL-Zeilen und Gruppen bleiben sichtbar.
Schritt 1 / 9 · Tasten ← →
📝 Die Abfrage (so wird sie geschrieben)
SELECT b.genre, COUNT(*) AS anzahl, ROUND(AVG(b.preis), 2) AS schnitt FROM buecher b WHERE b.preis < 30 GROUP BY b.genre HAVING COUNT(*) >= 2 ORDER BY anzahl DESC, b.genre
Klassiker mit allen Stufen außer JOIN: WHERE filtert Zeilen, HAVING filtert Gruppen. Achte auf das Buch ohne Preis – es scheitert schon am WHERE.
🔀 Geschrieben ≠ ausgeführt
Schreibreihenfolge
- SELECT6.
- DISTINCT7.
- FROM1.
- JOIN2.
- WHERE3.
- GROUP BY4.
- HAVING5.
- ORDER BY8.
- LIMIT9.
Logische Reihenfolge
- 1. FROM
- 2. JOIN
- 3. WHERE
- 4. GROUP BY
- 5. HAVING
- 6. SELECT
- 7. DISTINCT
- 8. ORDER BY
- 9. LIMIT
Schritt 1: FROM12 → 12 Zeilen
FROM buecher b
Zuerst wird die Ausgangstabelle buecher geladen (Alias b) – alle 12 Zeilen, alle Spalten. Noch ist nichts gefiltert oder ausgewählt.
| # | b.buch_id | b.titel | b.autor_id | b.genre | b.jahr | b.preis |
|---|---|---|---|---|---|---|
| 1 | 1 | Nebel über Lund | 1 | Krimi | 2015 | 12.99 |
| 2 | 2 | Die stille Brücke | 1 | Krimi | 2019 | 14.5 |
| 3 | 3 | Salz und Sterne | 2 | Roman | 2012 | 18 |
| 4 | 4 | Kartografie des Windes | 2 | Roman | 2021 | 22 |
| 5 | 5 | Der Garten der Zahlen | 3 | Sachbuch | 2018 | 24.9 |
| 6 | 6 | Lagos bei Nacht | 3 | Roman | 2020 | 16.8 |
| 7 | 7 | SQL für Neugierige | 4 | Sachbuch | 2023 | 29.9 |
| 8 | 8 | Datenflüsse | 4 | Sachbuch | 2021 | 34 |
| 9 | 9 | Kirschblüten im Schnee | 5 | Roman | 2016 | 15 |
| 10 | 10 | Das Rätsel von Kyoto | 5 | Krimi | 2022 | 13.9 |
| 11 | 11 | Volkslieder aus alter Zeit | NULL | Lyrik | 1998 | 9.9 |
| 12 | 12 | Tagebuch eines Algorithmus | 4 | NULL | 2024 | NULL |
verworfenmit NULL aufgefülltGruppe
🧠Was folgt daraus?
⚠️ Alias im WHERE? Geht nicht.
SELECT preis * 1.19 AS brutto … WHERE brutto > 20 scheitert im Standard (und z. B. in PostgreSQL, MySQL, SQL Server), weil WHERE (Stufe 3) vor SELECT (Stufe 6) läuft – SQLite erlaubt es als Erweiterung. Den Ausdruck wiederholen oder eine Unterabfrage/CTE verwenden.💡 WHERE oder HAVING?
WHERE filtert einzelne Zeilen vor dem Gruppieren, HAVING ganze Gruppen danach. Bedingungen ohne Aggregat gehören ins WHERE – das spart Arbeit.
✅ Nur logisch, nicht physisch
Der Optimierer darf umsortieren (z. B. Filter vor den JOIN ziehen), solange das Ergebnis gleich bleibt. Wie er es wirklich macht, zeigt
EXPLAIN.