0Pricing
SQL Academy · Lektion

Common Table Expressions (WITH)

Strukturieren Sie verschachtelte Abfragen in lesbare WITH-Klauseln um, verketten Sie CTEs und lernen Sie die Regeln zur Materialisierung in PostgreSQL 12+ kennen.

Common Table Expressions (WITH) ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist eine CTE?

Eine Common Table Expression (CTE) ist eine benannte Unterabfrage, die mit WITH definiert wird:

WITH paid_orders AS (
  SELECT * FROM orders WHERE status = 'paid'
)
SELECT user_id, COUNT(*)
FROM paid_orders
GROUP BY user_id;

Warum CTEs verwenden?

Drei große Vorteile:

  • Lesbarkeit — eine Abfrage mit 200 Zeilen in benannte Schritte aufteilen
  • Wiederverwendung — dasselbe Zwischenergebnis mehrmals referenzieren
  • Rekursion — nur CTEs unterstützen rekursive Abfragen (in der nächsten Lektion)

CTEs verketten

Definieren Sie mehrere CTEs in einem WITH und verwenden Sie eine davon in der nächsten:

WITH last_30 AS (
  SELECT * FROM orders WHERE created_at >= NOW() - INTERVAL '30 days'
),
per_user AS (
  SELECT user_id, SUM(total) AS revenue FROM last_30 GROUP BY user_id
)
SELECT u.email, p.revenue
FROM users u
JOIN per_user p ON p.user_id = u.id
ORDER BY p.revenue DESC LIMIT 20;

Eine CTE wiederverwenden

Wenn dasselbe Zwischenergebnis zweimal verwendet wird, macht eine CTE die Absicht deutlich:

WITH recent_users AS (
  SELECT id FROM users WHERE created_at >= NOW() - INTERVAL '7 days'
)
SELECT 'new orders'  AS metric, COUNT(*) FROM orders
  WHERE user_id IN (SELECT id FROM recent_users)
UNION ALL
SELECT 'new revenue', SUM(total) FROM orders
  WHERE user_id IN (SELECT id FROM recent_users);

Materialisierung von CTEs (PostgreSQL ≤ 11)

Ältere PG-Versionen materialisierten die Ausgabe von CTEs immer — eine Barriere für den Planer. Ab PG 12 löst der Planer CTEs standardmäßig inline auf, sofern Sie nichts anderes angeben:

-- Force the old materialise behaviour (rarely needed):
WITH x AS MATERIALIZED (SELECT ...) ...

-- Force inlining (default):
WITH x AS NOT MATERIALIZED (SELECT ...) ...

Datenändernde CTEs

CTEs können INSERT/UPDATE/DELETE verwenden — praktisch, um Zeilen atomar zwischen Tabellen zu verschieben:

WITH moved AS (
  DELETE FROM orders WHERE status = 'archived' RETURNING *
)
INSERT INTO orders_archive SELECT * FROM moved;

CTEs in DML

RETURNING + WITH für „finden und handeln“:

WITH cancelled AS (
  UPDATE orders SET status = 'cancelled'
  WHERE created_at < NOW() - INTERVAL '14 days'
    AND status = 'pending'
  RETURNING id
)
INSERT INTO audit_log (event, order_id)
SELECT 'auto-cancel', id FROM cancelled;

Ausführungsreihenfolge

Datenändernde CTEs werden unabhängig voneinander im selben Snapshot ausgeführt. Jede Anweisung sieht den Zustand VOR dem Start aller Änderungen — überraschend, aber vorhersehbar.

CTEs vs. Unterabfragen vs. Sichten

Vergleich:

  • Unterabfrage — inline definiert; einmalige Verwendung
  • CTE — benannt; innerhalb der Abfrage mehrfach verwendet; nach Ende der Abfrage nicht mehr vorhanden
  • View — benannt; dauerhaft gespeichert; in mehreren Abfragen wiederverwendbar

CTEs nicht übermäßig verwenden

Alles in eine CTE zu verpacken macht Abfragen lesbarer, kann aber die Kosten verschleiern. Bei sehr großen Zwischenergebnissen wählt der Planer möglicherweise schlechtere Pläne als bei einem gleichwertigen JOIN.

Zusammenfassung

CTEs geben Zwischenabfragen einen Namen.

  • Verbessern die Lesbarkeit
  • Ermöglichen die Wiederverwendung innerhalb einer Abfrage
  • Sind für Rekursion erforderlich
  • Werden in modernen PG-Versionen standardmäßig inline aufgelöst

Kurze Überprüfung

Welches Schlüsselwort leitet eine Common Table Expression ein?

Häufig gestellte Fragen

Ist die Lektion „Common Table Expressions (WITH)“ kostenlos?

Ja — der vollständige Text von „Common Table Expressions (WITH)“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Common Table Expressions (WITH)“?

Strukturieren Sie verschachtelte Abfragen in lesbare WITH-Klauseln um, verketten Sie CTEs und lernen Sie die Regeln zur Materialisierung in PostgreSQL 12+ kennen. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um SQL Academy zu starten?

Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Common Table Expressions (WITH)“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?

Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Skalare, Zeilen- und Tabellenunterabfragen
  2. Korrelierte und nicht korrelierte Unterabfragen
  3. Common Table Expressions (WITH)
  4. Rekursive CTEs für Hierarchien
← Zurück zu SQL Academy