Korrelierte und nicht korrelierte Unterabfragen
Verstehen Sie korrelierte Unterabfragen, die auf die äußere Zeile verweisen, ihre Performance-Eigenschaften und wann EXISTS besser als IN ist.
Korrelierte und nicht korrelierte Unterabfragen ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.
Nicht korrelierte Unterabfragen
Eine nicht korrelierte Unterabfrage verweist nicht auf die äußere Zeile. Sie wird einmal ausgeführt und ihr Ergebnis wiederverwendet:
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE status = 'paid'
);Korrelierte Unterabfragen
Eine korrelierte Unterabfrage verweist auf die äußere Zeile – logisch wird sie für jede äußere Zeile erneut ausgeführt:
SELECT u.id, u.email
FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.user_id = u.id
AND o.total > 1000
);So erkennen Sie den Unterschied
Wenn der innere SELECT auf eine Spalte aus dem äußeren FROM verweist, ist er korreliert.
Auswirkungen auf die Performance
Eine naive korrelierte Unterabfrage hat die Komplexität O(äußerer Datensatzbestand × innerer Datensatzbestand). Moderne Abfrageplaner schreiben sie häufig in einen Semi-Join oder Hash-Join um – trotzdem sollten Sie nach Möglichkeit die einfachere Form schreiben.
EXISTS vs. IN
Für „mindestens eine Übereinstimmung“:
-- IN with non-correlated subquery (often the planner's favourite):
SELECT u.* FROM users u
WHERE u.id IN (SELECT user_id FROM orders);
-- EXISTS with correlated subquery (NULL-safe alternative):
SELECT u.* FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);NOT EXISTS ist immer besser als NOT IN
NOT IN funktioniert nicht korrekt, wenn die innere Menge NULL enthält. NOT EXISTS tut das. Verwenden Sie für den Anti-Join immer NOT EXISTS:
-- BUG-prone:
SELECT u.* FROM users u
WHERE u.id NOT IN (SELECT excluded_id FROM blocklist);
-- Safe:
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM blocklist b WHERE b.excluded_id = u.id);Korrelierte Unterabfragen in SELECT
Das Muster „Nachschlagen pro Zeile“:
SELECT u.id, u.email,
(SELECT MAX(created_at) FROM orders o WHERE o.user_id = u.id) AS last_order_at
FROM users u;
-- Often readable, but consider a LEFT JOIN + GROUP BY.Korrelierte Unterabfragen in UPDATE
Ermitteln Sie einen abgeleiteten Wert pro Zeile:
UPDATE products p
SET review_count = (
SELECT COUNT(*) FROM reviews r WHERE r.product_id = p.id
);LATERAL JOIN: Ein übersichtlicheres Muster für Korrelationen
Für das „Nachschlagen einiger Zeilen pro äußerer Zeile“ ist LATERAL häufig übersichtlicher und schneller – dies wird in „Erweiterte JOIN-Muster“ behandelt.
Zwischenspeichern von Unterabfragen
PostgreSQL speichert die Ergebnisse von Unterabfragen standardmäßig nicht über mehrere Zeilen hinweg zwischen. Wenn dasselbe innere Ergebnis viele Male benötigt wird, verwenden Sie ein CTE.
Die Korrelationsspalte indizieren
Die innere Unterabfrage filtert anhand des Schlüssels der äußeren Zeile. Ohne einen Index für diesen Schlüssel erhalten Sie für jede äußere Zeile einen vollständigen Scan.
-- For the orders example, this is essential:
CREATE INDEX orders_user_id_idx ON orders(user_id);Zusammenfassung
Korrelierte Unterabfragen beziehen sich auf die äußere Zeile.
- EXISTS ist die klassische korrelierte Form
- NOT EXISTS gegenüber NOT IN bevorzugen
- Die Korrelationsspalte indizieren
- LATERAL ist in vielen Fällen eine übersichtlichere Alternative
Kurzer Test
Warum ist NOT EXISTS sicherer als NOT IN, wenn die innere Ergebnismenge NULL enthalten kann?
Häufig gestellte Fragen
Ist die Lektion „Korrelierte und nicht korrelierte Unterabfragen“ kostenlos?
Ja — der vollständige Text von „Korrelierte und nicht korrelierte Unterabfragen“ 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 „Korrelierte und nicht korrelierte Unterabfragen“?
Verstehen Sie korrelierte Unterabfragen, die auf die äußere Zeile verweisen, ihre Performance-Eigenschaften und wann EXISTS besser als IN ist. 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 2 von 4.
Wie lange dauert die Lektion „Korrelierte und nicht korrelierte Unterabfragen“?
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
- Skalare, Zeilen- und Tabellenunterabfragen
- Korrelierte und nicht korrelierte Unterabfragen
- Common Table Expressions (WITH)
- Rekursive CTEs für Hierarchien