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:
| Situation | Empfehlung |
|---|---|
| Du brauchst nur prüfen, ob ein Wert existiert | Unterabfrage (IN/EXISTS) |
| Du willst Daten aus zwei Tabellen kombinieren | JOIN |
| Berechnungen werden nur einmal benötigt | Unterabfrage |
| Die zweite Tabelle soll als zusätzliche Datenspalte erscheinen | JOIN |
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:
- Gängige Window-Funktionen in SQL
- ETL-/ELT-Prozesse einfach erklärt
- SQL Qualitätsprüfungen – KPIs sauber sicherstellen
Und natürlich:
👉 YouTube: https://www.youtube.com/@datenanalyst
