🪜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
  1. SELECT6.
  2. DISTINCT7.
  3. FROM1.
  4. JOIN2.
  5. WHERE3.
  6. GROUP BY4.
  7. HAVING5.
  8. ORDER BY8.
  9. LIMIT9.
Logische Reihenfolge
  1. 1. FROM
  2. 2. JOIN
  3. 3. WHERE
  4. 4. GROUP BY
  5. 5. HAVING
  6. 6. SELECT
  7. 7. DISTINCT
  8. 8. ORDER BY
  9. 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_idb.titelb.autor_idb.genreb.jahrb.preis
11Nebel über Lund1Krimi201512.99
22Die stille Brücke1Krimi201914.5
33Salz und Sterne2Roman201218
44Kartografie des Windes2Roman202122
55Der Garten der Zahlen3Sachbuch201824.9
66Lagos bei Nacht3Roman202016.8
77SQL für Neugierige4Sachbuch202329.9
88Datenflüsse4Sachbuch202134
99Kirschblüten im Schnee5Roman201615
1010Das Rätsel von Kyoto5Krimi202213.9
1111Volkslieder aus alter ZeitNULLLyrik19989.9
1212Tagebuch eines Algorithmus4NULL2024NULL
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.