Skalare Unterabfragen in SELECT und WHERE
Unterabfragen mit einem einzelnen Wert und der Fehler, wenn sie mehr als eine Zeile zurückgeben
Skalare Unterabfragen in SELECT und WHERE 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 ein Interviewer mit einer skalaren Unterabfrage meint
Eine skalare Unterabfrage ist eine Abfrage, die genau eine Zeile und eine Spalte zurückgibt – also einen einzelnen Wert. Da sie zu einem einzelnen Wert ausgewertet wird, können Sie sie in SQL fast überall dort einsetzen, wo auch ein Literal stehen könnte: in SELECT, WHERE, HAVING und sogar ORDER BY.
- Interviewer prüfen, ob Sie die Regel eine Zeile, eine Spalte kennen.
- Die klassische Falle: eine Unterabfrage, die versehentlich mehr als eine Zeile zurückgibt.
Wenn Sie diese Definition klar formulieren können, haben Sie bereits den ersten Prüfpunkt bestanden.
Eine skalare Unterabfrage in der SELECT-Liste
Wenn Sie eine skalare Unterabfrage in die SELECT-Liste aufnehmen, können Sie jeder Ergebniszeile einen berechneten Einzelwert hinzufügen. Hier zeigen wir jeden Mitarbeiter neben dem unternehmensweiten Durchschnittsgehalt.
Die Unterabfrage (SELECT AVG(salary) FROM employees) wird ausgeführt und reduziert die gesamte Tabelle auf eine Zahl. Diese Zahl wird anschließend in jeder Zeile wiederholt.
SELECT
name,
salary,
(SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;Eine skalare Unterabfrage in WHERE
Der gleiche Einzelwert kann einen Filter steuern. Eine sehr häufige Frage im Vorstellungsgespräch lautet: Finden Sie alle Personen, die mehr als der Unternehmensdurchschnitt verdienen.
Die Unterabfrage berechnet den Durchschnitt einmal, anschließend wird jede Zeile der äußeren Abfrage damit verglichen. Das ist nicht korreliert – die innere Abfrage hängt nicht von der äußeren Zeile ab und wird daher nur einmal ausgeführt.
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);Der Fehler „Mehr als eine Zeile“
Dies ist der Fehler, den Interviewer von Ihnen erwarten vorherzusehen. Wenn Sie Ihre Unterabfrage mit = oder > verwenden, sie aber mehrere Zeilen zurückgibt, löst die Engine folgenden Fehler aus:
- Postgres: more than one row returned by a subquery used as an expression
- MySQL: Subquery returns more than 1 row
Die folgende Abfrage schlägt fehl, weil es mehrere Mitarbeiter in Abteilung 5 geben kann – die Unterabfrage ist nicht skalar.
SELECT name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 5);Eine Unterabfrage in eine skalare Unterabfrage umwandeln
Es gibt zwei zuverlässige Möglichkeiten, einen einzelnen Wert zu garantieren:
- Verwenden Sie ein Aggregat wie
MAX,MINoderAVG– Aggregate ohneGROUP BYgeben immer eine Zeile zurück. - Verwenden Sie
LIMIT 1(Postgres/MySQL) oderFETCH FIRST 1 ROW ONLYnach einemORDER BY.
Die korrigierte Version fragt nach dem höchsten Gehalt in Abteilung 5.
SELECT name
FROM employees
WHERE salary = (
SELECT MAX(salary) FROM employees WHERE dept_id = 5
);Skalare Unterabfragen geben bei keinen Zeilen NULL zurück
Ein subtiler Punkt für Vorstellungsgespräche: Wenn eine skalare Unterabfrage null Zeilen findet, tritt kein Fehler auf – sie gibt NULL zurück. Dieses NULL setzt sich anschließend in Ihrem Vergleich fort.
Da salary > NULL zu UNKNOWN (nicht zu true) ausgewertet wird, gibt die äußere Abfrage keine Zeilen zurück. Kandidaten erwarten hier oft einen Fehler; die richtige Antwort lautet: stilles leeres Ergebnis.
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees WHERE dept_id = 9999
);Beispiel: Überdurchschnittlich verdienende Personen mit der Differenz
Führen wir beide Einsatzmöglichkeiten zusammen. Wir zeigen jede Person mit überdurchschnittlichem Gehalt und den Betrag, um den ihr Gehalt über dem Durchschnitt liegt. Dieselbe skalare Unterabfrage erscheint in SELECT und WHERE.
Ein Interviewer könnte fragen, ob die Unterabfrage zweimal ausgeführt wird. Logisch erscheint sie zweimal, aber ein guter Optimierer kann die nicht korrelierte Unterabfrage einmal auswerten und wiederverwenden.
SELECT
name,
salary,
salary - (SELECT AVG(salary) FROM employees) AS above_avg
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY above_avg DESC;Skalare Unterabfrage in ORDER BY
Da eine skalare Unterabfrage lediglich einen Wert darstellt, ist sie auch in ORDER BY zulässig. Das ist zwar selten der übersichtlichste Ansatz, aber Interviewer möchten gerne feststellen, ob Sie wissen, dass er erlaubt ist.
Hier sortieren wir Abteilungen nach einem Wert aus einer anderen Tabelle – der Anzahl ihrer Mitarbeiter – ohne einen Join zu verwenden.
SELECT d.dept_name
FROM departments d
ORDER BY (
SELECT COUNT(*) FROM employees e WHERE e.dept_id = d.id
) DESC;Skalar oder korreliert: Die Grenze kennen
Das obige ORDER BY-Beispiel verweist insgeheim auf d.id aus der äußeren Abfrage – dadurch wird es zu einer korrelierten skalaren Unterabfrage, die einmal pro äußerer Zeile ausgeführt wird.
Interviewer lieben diese Unterscheidung:
- Unkorrelierte skalare Unterabfrage: in sich abgeschlossen, wird einmal ausgeführt.
- Korrelierte skalare Unterabfrage: verweist auf die äußere Zeile, wird pro Zeile ausgeführt.
Beide sind weiterhin skalar, geben also einen Wert zurück, aber ihre Performance kann sich dramatisch unterscheiden.
Wann Sie keine skalare Unterabfrage verwenden sollten
Eine korrelierte skalare Unterabfrage in der SELECT-Liste ist praktisch, kann bei großen Tabellen jedoch langsam sein – sie wird für jede Zeile ausgeführt. Interviewer erwarten, dass Sie die Alternativen kennen:
- Einen
LEFT JOINauf eine voraggregierte abgeleitete Tabelle. - Eine Fensterfunktion wie
AVG(salary) OVER ().
Die folgende Variante mit einer Fensterfunktion erzeugt dieselbe Spalte mit dem Unternehmensdurchschnitt, ohne einen separaten Scan durch eine Unterabfrage.
SELECT
name,
salary,
AVG(salary) OVER () AS company_avg
FROM employees;Aussage für das Vorstellungsgespräch
Wenn Sie eine skalare Unterabfrage definieren sollen, sagen Sie: „Eine skalare Unterabfrage gibt eine Zeile und eine Spalte zurück. Sie verhält sich daher wie ein einzelner Wert und kann überall dort verwendet werden, wo ein Literal zulässig ist. Gibt sie mehr als eine Zeile zurück, erzeugt die Engine einen Fehler; gibt sie keine Zeilen zurück, liefert sie NULL.“
Dieser eine Satz deckt die Definition, den Fehlerfall und den NULL-Sonderfall ab – die drei Dinge, auf die jeder Interviewer achtet.
Kurzer Test
Testen Sie Ihr Verständnis des Verhaltens skalarer Unterabfragen.
Zusammenfassung
Sie beherrschen nun skalare Unterabfragen:
- Definition: eine Zeile, eine Spalte – wie ein Literal in SELECT, WHERE, HAVING und ORDER BY verwendbar.
- Mehrere Zeilen mit =/> verursachen einen Fehler; erzwingen Sie einen einzelnen Wert mit einem Aggregat oder
LIMIT 1. - Keine Zeilen ergeben NULL, wodurch Zeilen in einem Filter stillschweigend ausgeschlossen werden.
- Korrelierte skalare Unterabfragen werden pro Zeile ausgeführt; wenn die Performance wichtig ist, sollten Sie Joins oder Fensterfunktionen bevorzugen.
Als Nächstes: Unterabfragen in der FROM-Klausel, deren Ergebnis eine vollständige virtuelle Tabelle ist.
Häufig gestellte Fragen
Ist die Lektion „Skalare Unterabfragen in SELECT und WHERE“ kostenlos?
Ja — der vollständige Text von „Skalare Unterabfragen in SELECT und WHERE“ 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 „Skalare Unterabfragen in SELECT und WHERE“?
Unterabfragen mit einem einzelnen Wert und der Fehler, wenn sie mehr als eine Zeile zurückgeben 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 „Skalare Unterabfragen in SELECT und WHERE“?
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
- Skalare Unterabfragen in SELECT und WHERE
- Unterabfragen in der FROM-Klausel (abgeleitete Tabellen)
- IN-, ANY- und ALL-Unterabfragen
- EXISTS oder IN: Performance