0Pricing
SQL Academy · Lektion

Korrellierte Unterabfragen

Eine Unterabfrage, die von der äußeren Zeile abhängt

Korrellierte Unterabfragen ist eine kostenlose SQL Academy-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 Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist eine korrelierte Unterabfrage?

Eine korrelierte Unterabfrage ist eine Unterabfrage, die auf eine Spalte der äußeren (umschließenden) Abfrage verweist. Anders als eine reguläre Unterabfrage, die einmal ausgeführt wird und ein festes Ergebnis liefert, wird eine korrelierte Unterabfrage für jede von der äußeren Abfrage verarbeitete Zeile einmal ausgewertet.

Das macht sie leistungsfähig für zeilenweise Vergleiche, aber auch ressourcenintensiver als einfache Unterabfragen.

Einfache und korrelierte Unterabfragen

Der entscheidende Unterschied: Eine reguläre Unterabfrage enthält keinen Verweis auf die äußere Abfrage und kann eigenständig stehen. Eine korrelierte Unterabfrage hängt von der äußeren Zeile ab – Sie erkennen dies daran, dass der Alias der äußeren Tabelle innerhalb der Unterabfrage auftaucht.

Im folgenden Beispiel verweist das innere SELECT auf e1.department_id aus der äußeren Abfrage und stellt dadurch die Korrelation her.

-- Regular subquery (runs once)
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- Correlated subquery (runs once per outer row)
SELECT name, salary, department_id
FROM employees e1
WHERE salary > (
  SELECT AVG(salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

Beispieltabellen einrichten

Erstellen wir zwei Tabellen, die wir während dieser Lektion verwenden werden: employees und departments. Sie liefern realistische Daten, um korrelierte Unterabfragen in verschiedenen Szenarien zu veranschaulichen.

CREATE TABLE departments (
  id   INT PRIMARY KEY,
  name VARCHAR(50)
);

CREATE TABLE employees (
  id            INT PRIMARY KEY,
  name          VARCHAR(50),
  department_id INT REFERENCES departments(id),
  salary        NUMERIC(10,2),
  hire_date     DATE
);

INSERT INTO departments VALUES (1,'Engineering'),(2,'Sales'),(3,'HR');

INSERT INTO employees VALUES
  (1,'Alice',  1, 90000, '2020-03-01'),
  (2,'Bob',    1, 75000, '2021-06-15'),
  (3,'Carol',  2, 60000, '2019-01-10'),
  (4,'David',  2, 68000, '2022-09-01'),
  (5,'Eve',    3, 55000, '2020-07-20'),
  (6,'Frank',  1, 95000, '2018-11-05'),
  (7,'Grace',  3, 52000, '2023-02-28'),
  (8,'Henry',  2, 71000, '2021-04-12');

Mitarbeitende mit einem Gehalt über dem Abteilungsdurchschnitt

Ein klassischer Anwendungsfall für korrelierte Unterabfragen: Finden Sie alle Mitarbeitenden, deren Gehalt über dem Durchschnittsgehalt ihrer eigenen Abteilung liegt. Die innere Abfrage berechnet den Abteilungsdurchschnitt für jede Mitarbeiterzeile in der äußeren Abfrage neu.

SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary > (
  SELECT AVG(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id, e1.salary DESC;

Korrelierte Unterabfragen in SELECT verwenden

Korrelierte Unterabfragen sind nicht auf die WHERE-Klausel beschränkt – sie können auch in der SELECT-Liste erscheinen, um für jede Zeile einen Wert zu berechnen. Hier rufen wir neben dem Gehalt jeder Mitarbeiterin und jedes Mitarbeiters auch das Durchschnittsgehalt der jeweiligen Abteilung ab, alles in einer Abfrage.

SELECT
  e.name,
  e.salary,
  (
    SELECT ROUND(AVG(e2.salary), 2)
    FROM employees e2
    WHERE e2.department_id = e.department_id
  ) AS dept_avg_salary
FROM employees e
ORDER BY e.department_id, e.name;

Die bestbezahlten Mitarbeitenden pro Abteilung ermitteln

Mit einer korrelierten Unterabfrage können wir die Mitarbeitenden mit dem höchsten Gehalt in jeder Abteilung ermitteln. Die innere Abfrage findet das maximale Gehalt für die Abteilung der aktuellen Zeile, und die äußere Abfrage behält nur die Zeile, die diesem Wert entspricht.

SELECT e1.name, e1.department_id, e1.salary
FROM employees e1
WHERE e1.salary = (
  SELECT MAX(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
)
ORDER BY e1.department_id;

EXISTS mit einer korrelierten Unterabfrage

Der Operator EXISTS wird häufig mit korrelierten Unterabfragen kombiniert. Er gibt TRUE zurück, wenn die innere Abfrage mindestens eine Zeile liefert. Hier listen wir alle Abteilungen auf, in denen mindestens eine Person vor 2021 eingestellt wurde.

SELECT d.name AS department
FROM departments d
WHERE EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.id
    AND e.hire_date < '2021-01-01'
);

NOT EXISTS mit einer korrelierten Unterabfrage

NOT EXISTS ist das Gegenstück – es gibt TRUE zurück, wenn die korrelierte Unterabfrage keine passenden Zeilen findet. Dies ist nützlich, um übergeordnete Datensätze ohne untergeordnete Datensätze zu finden, etwa Abteilungen ohne Mitarbeitende.

SELECT d.name AS department_without_employees
FROM departments d
WHERE NOT EXISTS (
  SELECT 1
  FROM employees e
  WHERE e.department_id = d.id
);

Korrelierte Unterabfrage in UPDATE

Korrelierte Unterabfragen funktionieren auch innerhalb von UPDATE-Anweisungen. Das folgende Beispiel fügt eine Spalte dept_avg hinzu und verwendet anschließend eine korrelierte Unterabfrage, um sie mit dem durchschnittlichen Gehalt der jeweiligen Abteilung zu füllen.

ALTER TABLE employees ADD COLUMN dept_avg NUMERIC(10,2);

UPDATE employees e1
SET dept_avg = (
  SELECT ROUND(AVG(e2.salary), 2)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

SELECT name, salary, dept_avg FROM employees ORDER BY department_id, name;

Korrelierte Unterabfrage in DELETE

Sie können eine korrelierte Unterabfrage auch in einer DELETE-Anweisung verwenden, um Zeilen anhand von Daten aus einer verknüpften Tabelle zu entfernen. Die folgende Abfrage löscht Mitarbeitende, deren Gehalt unter 60 % des Durchschnittsgehalts ihrer Abteilung liegt – ein Muster zur Datenbereinigung.

DELETE FROM employees e1
WHERE e1.salary < (
  SELECT AVG(e2.salary) * 0.60
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

SELECT name, salary, department_id FROM employees ORDER BY department_id;

Performance-Tipp: Korrelierte Unterabfrage im Vergleich zu JOIN

Korrelierte Unterabfragen werden einmal pro äußerer Zeile ausgeführt, was bei großen Tabellen langsam sein kann. Viele korrelierte Unterabfragen lassen sich für eine bessere Performance als JOIN mit einer abgeleiteten Tabelle oder CTE umschreiben. Verstehen Sie beide Muster und wählen Sie abhängig von Lesbarkeit und Ausführungsplan.

-- Correlated version (potentially slower)
SELECT e1.name, e1.salary
FROM employees e1
WHERE e1.salary > (
  SELECT AVG(e2.salary)
  FROM employees e2
  WHERE e2.department_id = e1.department_id
);

-- Equivalent JOIN + derived table (often faster)
SELECT e.name, e.salary
FROM employees e
JOIN (
  SELECT department_id, AVG(salary) AS avg_sal
  FROM employees
  GROUP BY department_id
) dept_avg ON dept_avg.department_id = e.department_id
WHERE e.salary > dept_avg.avg_sal;

Kurzer Test

Testen Sie Ihr Verständnis von korrelierten Unterabfragen.

Zusammenfassung: Korrelierte Unterabfragen

In dieser Lektion haben Sie gelernt, dass eine korrelierte Unterabfrage auf eine Spalte ihrer äußeren Abfrage verweist und für jede äußere Zeile erneut ausgewertet wird. Wichtigste Erkenntnisse:

  • Sie können in SELECT, WHERE, UPDATE und DELETE auftreten.
  • EXISTS / NOT EXISTS lassen sich auf natürliche Weise mit korrelierten Unterabfragen kombinieren, um verknüpfte Zeilen zu prüfen.
  • Sie sind ausdrucksstark, können aber langsam sein – ziehen Sie eine Umschreibung als JOIN in Betracht, wenn die Performance wichtig ist.
  • Der Alias der äußeren Tabelle innerhalb der Unterabfrage stellt die Korrelation her.

Häufig gestellte Fragen

Ist die Lektion „Korrellierte Unterabfragen“ kostenlos?

Ja — der vollständige Text von „Korrellierte 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 „Korrellierte Unterabfragen“?

Eine Unterabfrage, die von der äußeren Zeile abhängt 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 1 von 4.

Wie lange dauert die Lektion „Korrellierte 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

  1. Korrellierte Unterabfragen
  2. EXISTS und NOT EXISTS
  3. IN vs. ANY vs. ALL
  4. EXISTS- vs. JOIN-Performance
← Zurück zu SQL Academy