Level 16: Mit WITH strukturieren (CTE)
Aktualisiert am
Profi · Level 16 von 20. Ziel: Eine komplexe Abfrage in benannte, lesbare Schritte zerlegen.
Themen: WITH CTE mehrere CTE eine CTE wiederverwenden
Lektion
Wenn eine Abfrage mehrere Berechnungen aneinanderreiht, verschachteln sich die Unterabfragen, und das Lesen wird schwierig: Man muss von innen nach außen lesen. WITH erlaubt, dieselben Schritte von oben nach unten zu schreiben, wie ein Rezept.
WITH name AS (SELECT …) erzeugt eine benannte temporäre Tabelle, die die nachfolgende Abfrage wie eine echte Tabelle verwenden kann. Man nennt das eine CTE (Common Table Expression, „allgemeiner Tabellenausdruck“). Sie existiert nur für die Dauer der Abfrage: In der Datenbank wird nichts gespeichert.
Beispiel: WITH totals AS (SELECT seller, SUM(amount) AS total FROM sales GROUP BY seller) SELECT seller, total FROM totals WHERE total > 1200. Der erste Schritt berechnet den Umsatz jedes Verkäufers; der zweite filtert dieses Ergebnis mit einem einfachen WHERE, da total jetzt eine gewöhnliche Spalte von totals ist.
Man kann mehrere CTEs aneinanderreihen, durch Kommas getrennt, ohne WITH zu wiederholen: WITH a AS (…), b AS (… FROM a …) SELECT … FROM b. Jede CTE kann die vorhergehenden verwenden. Die abschließende Abfrage folgt nach der letzten, ohne Komma.
Eine CTE kann in derselben Abfrage mehrmals gelesen werden. Eine CTE monthly, die den Umsatz jedes Monats berechnet, kann sowohl im FROM als auch in einer Unterabfrage dienen, die den Durchschnitt dieser Umsätze berechnet, ohne die Berechnung neu zu schreiben.
Methodentipp: Baue eine CTE nach der anderen. Schreibe den ersten Schritt, führe ihn allein aus und prüfe sein Ergebnis, dann füge den nächsten Schritt hinzu. Ist das Endergebnis falsch, weißt du, in welchem Schritt du suchen musst.
Achte auf die Zeichensetzung: kein Semikolon zwischen einer CTE und dem Rest der Abfrage, es würde sie in zwei Teile schneiden.
Syntax
WITH schritt1 AS (
SELECT …
),
schritt2 AS (
SELECT …
FROM schritt1
)
SELECT …
FROM schritt2;Kommentiertes Beispiel
WITH totals AS (
SELECT seller, SUM(amount) AS total
FROM sales
GROUP BY seller
)
SELECT seller, total
FROM totals
WHERE total > 1200;Schritt 1: die Summe pro Verkäufer. Schritt 2: Wir filtern dieses Ergebnis wie eine gewöhnliche Tabelle.
| 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
- WITH name AS (abfrage) benennt einen Schritt.
- Mehrere CTE werden durch Kommas getrennt, ohne WITH zu wiederholen.
- Die Hauptabfrage folgt nach der letzten CTE.
Häufige Fallen
- Ein Semikolon nach der Klammer der CTE schneidet die Abfrage in zwei.
- Eine CTE existiert nur für die Dauer der Abfrage.
Die 5 Übungen des Levels
- Zeige mit einer CTE it, die die Mitarbeitenden der Abteilung 'IT' enthält, den Namen und das Einstellungsdatum derer, die nach 2018 eingestellt wurden (ab dem 1. Januar 2019).
- Berechne mit einer CTE den Durchschnitt jedes Schülers (student_id) und zeige dann die Schüler, deren Durchschnitt mindestens 13 beträgt, auf 2 Nachkommastellen gerundet (avg_grade).
- Zeige mit einer CTE done, die die Stunden der erledigten Aufgaben (status = 'done') pro Projekt berechnet, den Namen jedes Projekts und diese Stunden.
- Zeige mit einer CTE monthly, die die Verkaufssumme jedes Monats berechnet, die Monate, deren Summe über dem Durchschnitt der Monatssummen liegt.
- Berechne den Saldo jedes Kontos (Summe seiner Transaktionen) und dann das Gesamtvermögen jedes Inhabers (owner), vom reichsten zum ärmsten. Konten ohne Transaktion werden ignoriert.
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 16 machen
Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.
← Vorheriges Level: EXISTS und korrelierte Unterabfragen · Nächstes Level: Fensterfunktionen: Ränge bilden →