SQL Unterabfragen erklärt

SQL-Unterabfragen sind eine der mächtigsten Funktionen in relationalen Datenbanken – und gleichzeitig eine der am meisten missverstandenen. Viele Einsteiger nutzen sie intuitiv, ohne genau zu wissen, was im Hintergrund passiert. Und genau das schauen wir uns heute gemeinsam an: Klar, anschaulich und mit praxisnahen Beispielen.

Wenn du neu in SQL bist, findest du hier den idealen Einstieg. Und selbst erfahrene Entwickler entdecken vielleicht noch einen Trick, um Abfragen effizienter zu gestalten.

(Tipp: Für noch mehr SQL-Wissen findest du verwandte Beiträge wie „ETL-/ELT-Prozesse einfach erklärt“ und „Gängige Window-Funktionen in SQL“ auf datenanalyst.com.)

Was ist eine Unterabfrage – und warum brauchst du sie überhaupt?

Eine Unterabfrage (engl. Subquery) ist eine SELECT-Abfrage, die innerhalb einer anderen Abfrage ausgeführt wird. Sie kann:

  • Werte liefern (z. B. einen Durchschnitt)
  • Listen erzeugen (z. B. eine Liste an Kunden-IDs)
  • Bedingungen festlegen (z. B. „Gehalt > (Durchschnitt)“)
  • pro Zeile dynamisch berechnet werden (bei korrelierten Unterabfragen)

Unterabfragen ersparen dir also separate Zwischenschritte, weil du berechnete Werte direkt dort einsetzen kannst, wo du sie brauchst.

Beispiel 1: Unterabfragen im WHERE – der Klassiker

Wir starten mit dem bekanntesten Szenario: Eine Bedingung basiert auf einem dynamischen Wert.

Ziel: Zeige alle Mitarbeiter, die über dem Unternehmensdurchschnitt verdienen.

SELECT Name, Gehalt
FROM Mitarbeiter
WHERE Gehalt > (
    SELECT AVG(Gehalt)
    FROM Mitarbeiter
);

Die Unterabfrage liefert genau einen Wert: den Durchschnitt.
Die Hauptabfrage vergleicht jede Zeile damit – fertig.

Das spart dir den sonst üblichen 2-Schritt-Prozess (Berechnen → Merken → Einsetzen).

Beispiel 2: Unterabfragen im SELECT – neue Spalten erzeugen

Subqueries lassen sich auch direkt in der SELECT-Liste nutzen.

Ziel: Zeige für jeden Mitarbeiter, wie stark sein Gehalt vom Durchschnitt abweicht.

SELECT 
    Name,
    Gehalt,
    Gehalt - (SELECT AVG(Gehalt) FROM Mitarbeiter) AS DifferenzZumSchnitt
FROM Mitarbeiter;

Praktisch für:

  • KPI-Berechnungen
  • Power-BI-Quellen
  • schnelle Explorationsanalysen

Wenn du BI-Analysen häufiger machst, findest du dazu auch unseren Beitrag „Power BI Datumstabelle erstellen – Warum sie so wichtig ist“.

Beispiel 3: Unterabfragen mit IN – wer kommt in einer anderen Tabelle vor?

Unterabfragen mit IN oder EXISTS sind extrem häufig.

Ziel: Zeige alle Kunden, die mindestens eine Bestellung aufgegeben haben.

SELECT *
FROM Kunden
WHERE KundenID IN (
    SELECT KundenID
    FROM Bestellungen
);

Die Unterabfrage liefert eine Liste von IDs, die Hauptabfrage filtert.

Solche Abfragen brauchst du in nahezu jedem Analyseprojekt – besonders im Reporting.

Beispiel 4: Korrelierte Unterabfragen – maximale Flexibilität

Jetzt wird’s spannend.
Eine korrelierte Unterabfrage wird für jede Zeile der Hauptabfrage wiederholt ausgeführt.

Ziel: Finde den höchsten Gehaltswert pro Abteilung.

SELECT Name, Abteilung, Gehalt
FROM Mitarbeiter m1
WHERE Gehalt = (
    SELECT MAX(Gehalt)
    FROM Mitarbeiter m2
    WHERE m2.Abteilung = m1.Abteilung
);

Diese Abfrage „zieht“ pro Abteilung genau die Person mit dem Top-Gehalt.

Vorteile:

  • extrem flexibel
  • perfekt für Top-N-Analysen

Nachteil:

  • bei vielen Millionen Zeilen kann es langsam werden → Alternativen sind häufig Window-Funktionen oder GROUP BY + JOIN.

Wenn du Performance liebst, lies auch unseren Beitrag „Divide and Conquer in SQL – Debugging durch Logik statt Struktur“.

Unterabfrage oder JOIN – was ist besser?

Hier die klare Faustregel:

SituationEmpfehlung
Du brauchst nur prüfen, ob ein Wert existiertUnterabfrage (IN/EXISTS)
Du willst Daten aus zwei Tabellen kombinierenJOIN
Berechnungen werden nur einmal benötigtUnterabfrage
Die zweite Tabelle soll als zusätzliche Datenspalte erscheinenJOIN

Der Unterschied klingt leicht – aber in der Praxis spart dir diese Entscheidung oft Performance.

SQL-Challenge für dich

Teste dein Wissen:

👉 Schreibe eine Abfrage, die alle Kunden zeigt,
die mehr Bestellungen als der Durchschnitt aller Kunden haben.

Denke daran:

  • Du brauchst den Durchschnitt aller Bestell-Anzahlen
  • Du musst pro Kunde zählen
  • Und du musst vergleichen

Wenn du magst, schick mir deine Lösung – ich gebe dir Feedback!
Und wenn du mit echten Daten üben willst, hol dir unten die Beispiel-Datenbank.

Wenn dir der Beitrag gefallen hat, schau auch in verwandte Artikel wie:

Und natürlich:
👉 YouTube: https://www.youtube.com/@datenanalyst