0Pricing
SQL Interview Prep · Lektion

Unterabfragen in der FROM-Klausel (abgeleitete Tabellen)

Eine Abfrage als virtuelle Tabelle verwenden und verstehen, warum Aliase obligatorisch sind

Unterabfragen in der FROM-Klausel (abgeleitete Tabellen) ist eine kostenlose SQL Interview Prep-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 Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was eine abgeleitete Tabelle ist

Eine Unterabfrage in der FROM-Klausel wird als abgeleitete Tabelle (oder Inline View) bezeichnet. Sie gibt nicht nur einen einzelnen Wert zurück, sondern eine vollständige Ergebnismenge, die die äußere Abfrage wie eine echte Tabelle behandelt.

  • Sie kann viele Zeilen und viele Spalten enthalten.
  • Sie können sie wie jede Tabelle abfragen, mit ihr Joins durchführen und sie filtern.

Interviewer verwenden abgeleitete Tabellen, um zu prüfen, ob Sie ein Problem in mehrere Schritte zerlegen können.

Aliase sind zwingend erforderlich

Der wichtigste Stolperstein: Eine abgeleitete Tabelle muss einen Alias haben. Ohne Alias lehnen die meisten Engines die Abfrage ab.

  • MySQL: Every derived table must have its own alias.
  • Postgres: subquery in FROM must have an alias.

Geben Sie ihr einen Namen (hier dept_avg), dann können Sie über diesen Namen auf ihre Spalten zugreifen.

SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS dept_avg;

Warum Sie in einer abgeleiteten Tabelle voraggregieren

Eine häufige Aufgabe im Vorstellungsgespräch lautet: Zeigen Sie jeden Mitarbeiter zusammen mit dem durchschnittlichen Gehalt seiner Abteilung. Sie können die Detailzeile nicht direkt mit einem Aggregat kombinieren, ohne auf Gruppierungsprobleme zu stoßen.

Der saubere Ansatz besteht darin, den Durchschnitt pro Abteilung in einer abgeleiteten Tabelle zu berechnen und diese anschließend wieder mit den Detailzeilen zu verknüpfen. Die abgeleitete Tabelle wird zunächst auf eine Zeile pro Abteilung reduziert.

SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;

Nach einem Aggregatergebnis filtern

Mit abgeleiteten Tabellen können Sie nach einem berechneten Aggregat filtern, ohne in der äußeren Abfrage mit HAVING arbeiten zu müssen. Nehmen wir an, Sie möchten nur Abteilungen, deren durchschnittliches Gehalt über 60000 liegt.

Wir aggregieren innerhalb der Unterabfrage und wenden anschließend außerhalb ein einfaches WHERE auf die abgeleitete Spalte an. Für die äußere Abfrage ist avg_salary eine gewöhnliche Spalte.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;

Zwei Ebenen der Aggregation

Abgeleitete Tabellen spielen ihre Stärke aus, wenn Sie ein Aggregat eines Aggregats benötigen – eine klassische Frage im Vorstellungsgespräch: Wie hoch ist der Durchschnitt der durchschnittlichen Gehälter pro Abteilung?

Sie können AVG(AVG(...)) nicht direkt verschachteln. Die innere Abfrage erzeugt einen Durchschnitt pro Abteilung, die äußere Abfrage bildet daraus den Durchschnitt.

SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY dept_id
) AS d;

Berechnete Spalten benennen

Jeder Ausdruck in einer abgeleiteten Tabelle benötigt einen Alias, wenn Sie außerhalb darauf zugreifen möchten. Für salary * 12 würde die Datenbank andernfalls einen Namen vergeben, auf den Sie sich nicht verlassen können.

Versehen Sie berechnete Spalten immer mit einem Alias – Interviewer bemerken es, wenn Sie auf einen Ausdruck ohne Alias verweisen und einen Spaltennamen annehmen, der möglicherweise nicht existiert.

SELECT name, annual_salary
FROM (
  SELECT name, salary * 12 AS annual_salary
  FROM employees
) AS yearly
WHERE annual_salary > 100000;

Zwei abgeleitete Tabellen verknüpfen

Sie können mehrere abgeleitete Tabellen miteinander verknüpfen. Hier vergleichen wir die Mitarbeiterzahl jeder Abteilung mit ihrer gesamten Lohnsumme, indem wir zwei voraggregierte Unterabfragen miteinander verknüpfen.

Jede abgeleitete Tabelle beantwortet eine Teilfrage; der Join fügt sie zum endgültigen Bericht zusammen. Dieses schrittweise Denken wird in Vorstellungsgesprächen auf mittlerem Niveau genau erwartet.

SELECT c.dept_id, c.headcount, p.payroll
FROM (
  SELECT dept_id, COUNT(*) AS headcount
  FROM employees GROUP BY dept_id
) AS c
JOIN (
  SELECT dept_id, SUM(salary) AS payroll
  FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;

Gültigkeitsbereich: Die äußere Abfrage kann nicht nach innen sehen

Eine wichtige Regel: Die äußere Abfrage kann nur auf die Spalten verweisen, die die abgeleitete Tabelle in ihrer SELECT-Liste offenlegt. Spalten, die nur innerhalb der Unterabfrage verwendet werden, sind außerhalb nicht sichtbar.

Wenn die innere Abfrage dept_id und avg_salary auswählt, sind salary oder name außerhalb nicht verfügbar – sie wurden von der Aggregation verarbeitet. Interviewer prüfen, ob Sie diese Grenze des Gültigkeitsbereichs verstehen.

SELECT dept_id, avg_salary
FROM (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
) AS d;

Abgeleitete Tabelle oder CTE

Eine abgeleitete Tabelle und eine Common Table Expression (CTE) erzeugen häufig denselben Ausführungsplan. Interviewer fragen möglicherweise, warum Sie sich für die eine oder die andere Variante entscheiden würden:

  • Abgeleitete Tabelle: inline, geeignet für eine einmalige Verwendung.
  • CTE (WITH): am Anfang benannt, übersichtlich und wiederverwendbar, wenn sie mehrfach referenziert wird.

Bei tief verschachtelter Logik lässt sich eine CTE-Pipeline von oben nach unten lesen; eine abgeleitete Tabelle liest sich von innen nach außen.

WITH dept_avg AS (
  SELECT dept_id, AVG(salary) AS avg_salary
  FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;

Die LATERAL- bzw. korrelierte FROM-Unterabfrage

Normalerweise kann eine FROM-Unterabfrage nicht auf die Zeilen der äußeren Abfrage verweisen. LATERAL (Postgres) oder CROSS APPLY (SQL Server) hebt diese Einschränkung auf und ermöglicht es, die abgeleitete Tabelle pro äußerer Zeile auszuführen.

Damit lassen sich Top-N-Abfragen pro Zeile umsetzen. Wenn Sie wissen, dass dieses Schlüsselwort existiert, zeigen Sie auch in einem Gespräch für eine Position auf mittlerem Niveau fortgeschrittenes Fachwissen.

SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
  SELECT name, salary FROM employees e
  WHERE e.dept_id = d.id
  ORDER BY salary DESC LIMIT 1
) AS top_emp;

Interview-Kernaussage

Wenn Sie nach Unterabfragen in der FROM-Klausel gefragt werden, sagen Sie: "Eine Derived Table ist eine Unterabfrage in FROM, die eine Ergebnismenge zurückgibt, die die äußere Abfrage wie eine Tabelle verwendet. Sie muss einen Alias haben, die äußere Abfrage kann nur die von ihr ausgewählten Spalten sehen, und sie eignet sich ideal, um vor einem Join vorab zu aggregieren oder ein Aggregat erneut zu aggregieren."

Fügen Sie hinzu, dass LATERAL den Zugriff auf Zeilen der äußeren Abfrage ermöglicht, und Sie haben alle Aspekte abgedeckt.

Schnelltest

Wählen Sie die Aussage aus, die für eine Unterabfrage in der FROM-Klausel immer erforderlich ist.

Zusammenfassung

Derived Tables, jetzt sicher beherrscht:

  • Eine FROM-Unterabfrage gibt eine virtuelle Tabelle zurück – viele Zeilen, viele Spalten.
  • Sie muss einen Alias haben; die äußere Abfrage sieht nur die von ihr ausgewählten Spalten.
  • Verwenden Sie sie, um vor einem Join vorab zu aggregieren, nach Aggregaten zu filtern oder ein Aggregat erneut zu aggregieren.
  • Eine CTE ist die besser lesbare benannte Alternative; LATERAL/CROSS APPLY ermöglichen den Zugriff auf Zeilen der äußeren Abfrage.

Als Nächstes: Unterabfragen zur Mengenzugehörigkeit mit IN, ANY und ALL.

Häufig gestellte Fragen

Ist die Lektion „Unterabfragen in der FROM-Klausel (abgeleitete Tabellen)“ kostenlos?

Ja — der vollständige Text von „Unterabfragen in der FROM-Klausel (abgeleitete Tabellen)“ 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 „Unterabfragen in der FROM-Klausel (abgeleitete Tabellen)“?

Eine Abfrage als virtuelle Tabelle verwenden und verstehen, warum Aliase obligatorisch sind 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 2 von 4.

Wie lange dauert die Lektion „Unterabfragen in der FROM-Klausel (abgeleitete Tabellen)“?

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

  1. Skalare Unterabfragen in SELECT und WHERE
  2. Unterabfragen in der FROM-Klausel (abgeleitete Tabellen)
  3. IN-, ANY- und ALL-Unterabfragen
  4. EXISTS oder IN: Performance
← Zurück zu SQL Interview Prep