Aufbau einer korrelierten Unterabfrage
Erfahren, wie die innere Abfrage auf die äußere Zeile verweist und wie das zeilenweise Ausführungsmodell funktioniert
Aufbau einer korrelierten Unterabfrage ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 1 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 Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was eine Unterabfrage korreliert macht
Interviewer teilen Unterabfragen in zwei Gruppen ein. Eine einfache (unkorrelierte) Unterabfrage kann eigenständig ausgeführt werden. Eine korrelierte Unterabfrage verweist auf eine Spalte aus der äußeren Abfrage und kann daher nicht eigenständig ausgeführt werden.
- Unkorreliert: Wird einmal ausgewertet, und das Ergebnis wird für jede äußere Zeile wiederverwendet.
- Korreliert: Wird einmal pro äußerer Zeile erneut ausgewertet, weil sie von dieser Zeile abhängt.
Das verräterische Zeichen ist eine Spalte aus der äußeren Tabelle innerhalb der inneren Abfrage. Wenn Sie das erkennen, können Sie das Muster sofort benennen.
Das Ausführungsmodell pro Zeile
Stellen Sie sich vor, dass die Engine die äußeren Zeilen durchläuft. Für jede äußere Zeile setzt sie die Werte dieser Zeile in die innere Abfrage ein, führt sie aus und verwendet das Ergebnis, um etwas zu entscheiden oder zu berechnen.
Das ist das mentale Modell, das Sie im Vorstellungsgespräch in Worte fassen können sollen: „Die innere Abfrage wird einmal für jede äußere Zeile ausgeführt.“
Diese Formulierung deutet auch auf die klassische Anschlussfrage hin: Korrelierte Unterabfragen können langsam sein, weil die innere Abfrage möglicherweise Tausende Male ausgeführt wird. Das beheben wir in Lektion 4.
Die Referenz auf die äußere Zeile erkennen
Hier liefern employees und der äußere Alias e1 die Grundlage für eine innere Abfrage, die e1.dept_id liest. Diese Referenz auf die äußere Zeile ist die Korrelation.
Entfernen Sie das Alias-Präfix, lässt sich die innere Abfrage nicht mehr eigenständig kompilieren. Genau diese Abhängigkeit macht sie korreliert.
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.dept_id = e1.dept_id
);Diese Abfrage laut formulieren
Übersetzen Sie die vorherige Abfrage in Alltagssprache, so wie Sie es in einem Vorstellungsgespräch tun würden:
„Für jeden Mitarbeiter e1 ermitteln Sie das durchschnittliche Gehalt seiner eigenen Abteilung und behalten den Mitarbeiter nur dann, wenn er mehr als diesen Abteilungsdurchschnitt verdient.“
Die WHERE e2.dept_id = e1.dept_id-Bedingung der inneren Abfrage bindet den Durchschnitt an die Abteilung dieses Mitarbeiters. Ohne diese Zeile würden Sie alle mit dem unternehmensweiten Durchschnitt vergleichen.
Aliase sind zwingend erforderlich
Wenn die innere und die äußere Abfrage auf dieselbe Tabelle zugreifen, müssen Sie beide mit einem Alias versehen, damit die Engine weiß, zu welcher Zeile eine Spalte gehört.
e1= die äußere, geprüfte Zeile.e2= der innere Tabellenscan.
Lassen Sie die Aliase weg, wird dept_id mehrdeutig; viele Engines ordnen die Spalte dann stillschweigend der inneren Tabelle zu, wodurch die Korrelation zerstört wird. Interviewer bauen genau diesen Fehler ein.
Korrelierte Unterabfrage in SELECT
Korrelierte Unterabfragen sind nicht auf WHERE beschränkt. In einer SELECT-Liste erzeugen sie eine berechnete Spalte, die ebenfalls für jede äußere Zeile ausgewertet wird.
Im folgenden Beispiel zeigt jede Bestellung, wie viele anderen Bestellungen derselbe Kunde aufgegeben hat. Die innere Zählung ist über o.customer_id korreliert.
SELECT o.order_id,
o.customer_id,
(SELECT COUNT(*)
FROM orders o2
WHERE o2.customer_id = o.customer_id) AS customer_order_count
FROM orders o;Skalar bedeutet genau einen Wert
Eine korrelierte Unterabfrage, die in SELECT verwendet oder mit =, >, < verglichen wird, muss pro äußerer Zeile einen einzelnen Skalarwert zurückgeben.
Gibt sie mehr als eine Zeile zurück, löst die Datenbank einen Fehler aus, etwa „Die Unterabfrage gibt mehr als eine Zeile zurück.“
Aggregate wie COUNT, MAX oder AVG garantieren einen Wert. Deshalb werden sie häufig in skalaren korrelierten Unterabfragen verwendet. Wenn Sie diese Regel kennen, vermeiden Sie eine häufige Überraschung zur Laufzeit.
Wenn die Unterabfrage NULL zurückgibt
Eine skalare korrelierte Unterabfrage kann auf null innere Zeilen treffen. Ein Aggregat gibt dann NULL zurück, bei COUNT dagegen 0.
Diese NULL fließt in den äußeren Ausdruck ein. Vergleiche mit NULL ergeben UNKNOWN, sodass die äußere Zeile möglicherweise stillschweigend ausgeschlossen wird.
Wenn Sie einen Ersatzwert benötigen, schließen Sie die Unterabfrage in COALESCE ein. Interviewer fragen gerne, was passiert, wenn keine innere Zeile gefunden wird, und erwarten, dass Sie das Verhalten von NULL erwähnen.
SELECT c.customer_id,
COALESCE((SELECT MAX(o.amount)
FROM orders o
WHERE o.customer_id = c.customer_id), 0) AS biggest_order
FROM customers c;Durchgearbeitetes Beispiel: Datum der letzten Bestellung
Eine häufige Aufgabe: Zeigen Sie jeden Kunden mit dem Datum seiner letzten Bestellung an. Eine korrelierte Unterabfrage in SELECT erledigt das direkt.
Für jede Kundenzeile ermittelt die innere Abfrage über o.customer_id = c.customer_id das MAX-Bestelldatum für genau diesen Kunden.
SELECT c.customer_id,
c.name,
(SELECT MAX(o.order_date)
FROM orders o
WHERE o.customer_id = c.customer_id) AS last_order_date
FROM customers c;Warum es langsam sein kann
Da die innere Abfrage einmal pro äußerer Zeile ausgeführt wird, kann eine korrelierte Unterabfrage über einer großen äußeren Tabelle Millionen innerer Ausführungen auslösen.
- Ein Index auf der korrelierten Spalte, hier
orders.customer_id, sorgt dafür, dass jede innere Ausführung schnell abgeschlossen wird. - Ohne Index muss jede Ausführung möglicherweise die gesamte Tabelle durchsuchen, was ungefähr einem Aufwand von O(n*m) entspricht.
Erwähnen Sie im Vorstellungsgespräch immer den Index und die Umschreibung in einen Join als Stellschrauben für die Performance.
Korrelierte und unkorrelierte Abfrage im Vergleich
Der Unterschied besteht in einer Zeile. Die unkorrelierte Version vergleicht alle mit dem Unternehmensdurchschnitt; die korrelierte Version vergleicht jede Person mit ihrer eigenen Abteilung.
Lesen Sie beide Abfragen und achten Sie darauf, wie die einzelne Zeile WHERE e2.dept_id = e1.dept_id die gesamte Bedeutung verändert.
-- Uncorrelated: one global average, computed once
SELECT name FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
-- Correlated: per-department average, recomputed per row
SELECT e1.name FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary) FROM employees e2
WHERE e2.dept_id = e1.dept_id
);Kurzer Test
Testen Sie, ob Sie verstanden haben, was eine korrelierte Unterabfrage ausmacht.
Zusammenfassung: Aufbau einer korrelierten Unterabfrage
Die wichtigsten Punkte:
- Eine korrelierte Unterabfrage referenziert die äußere Zeile und wird einmal pro äußerer Zeile ausgeführt.
- Wenn es sich um dieselbe Tabelle handelt, versehen Sie beide Tabellen mit einem Alias, damit die Korrelation eindeutig bleibt.
- Bei skalarer Verwendung muss genau ein Wert zurückgegeben werden; bei null Treffern entsteht NULL. Sichern Sie diesen Fall daher mit
COALESCEab. - Eine korrelierte Unterabfrage kann in SELECT oder WHERE stehen; ihre Performance hängt davon ab, ob die korrelierte Spalte indiziert ist.
Sagen Sie im Vorstellungsgespräch „wird einmal pro äußerer Zeile ausgeführt“, dann haben Sie das Kernkonzept verstanden.
Häufig gestellte Fragen
Ist die Lektion „Aufbau einer korrelierten Unterabfrage“ kostenlos?
Ja — der vollständige Text von „Aufbau einer korrelierten Unterabfrage“ 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 Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Aufbau einer korrelierten Unterabfrage“?
Erfahren, wie die innere Abfrage auf die äußere Zeile verweist und wie das zeilenweise Ausführungsmodell funktioniert Du übst SQL Interview Prep 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 Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. SQL Interview Prep 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 1 von 4.
Wie lange dauert die Lektion „Aufbau einer korrelierten Unterabfrage“?
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 Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede SQL Interview Prep-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
- Aufbau einer korrelierten Unterabfrage
- Aggregierte Werte pro Gruppe ohne GROUP BY
- Korrelierte EXISTS- und NOT-EXISTS-Abfragen
- Korrelierte Unterabfragen als JOINs umschreiben