0Pricing
SQL Interview Prep · Lektion

NULL zurückgeben, wenn kein n-ter Wert existiert

Den von Interviewern beliebten Sonderfall elegant behandeln, wenn zu wenige Zeilen vorhanden sind

NULL zurückgeben, wenn kein n-ter Wert existiert ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 4 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.

Der Sonderfall, den Interviewer lieben

Nachdem Sie die Abfrage für das N-höchste Gehalt beherrschen, ergänzt der Interviewer: „Was ist, wenn die Tabelle weniger als N unterschiedliche Gehälter enthält? Ich möchte ein einzelnes NULL und kein leeres Ergebnis.“

Diese Frage trennt Kandidaten, die eine Abfrage auswendig gelernt haben, von denen, die das Verhalten von Ergebnismengen verstehen. Viele Lösungen geben stillschweigend null Zeilen statt einer Zeile mit NULL zurück.

In dieser Lektion geht es darum, genau eine Ausgabezeile zu erzwingen, deren Wert NULL ist, wenn kein N-ter Wert existiert.

Warum DENSE_RANK allein keine Zeilen zurückgibt

Erinnern Sie sich an die Standardabfrage für das N-höchste Gehalt. Gibt es nur zwei unterschiedliche Gehälter und fragen Sie nach dem dritten, trifft WHERE rnk = 3 auf nichts zu, sodass die Abfrage eine leere Ergebnismenge mit null Zeilen zurückgibt.

Eine leere Ergebnismenge ist nicht dasselbe wie eine Zeile mit NULL. Wenn die Spezifikation „NULL zurückgeben“ verlangt, schlägt ein leeres Ergebnis den Test fehl, auch wenn die zugrunde liegende Logik korrekt ist.

SELECT salary
FROM (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) t
WHERE rnk = 3;  -- returns NO rows if fewer than 3 distinct salaries

Lösung 1: Ein äußeres SELECT verwenden

Die einfachste zuverlässige Lösung: Machen Sie die gesamte Abfrage für das N-höchste Gehalt zu einer skalaren Unterabfrage innerhalb eines einzelnen SELECT. Eine skalare Unterabfrage, die keine Zeilen findet, wird zu NULL ausgewertet, und das äußere SELECT erzeugt immer genau eine Zeile.

Das ist die kanonische Antwort auf die LeetCode-Variante „NULL zurückgeben“ und funktioniert in jedem SQL-Dialekt.

SELECT (
  SELECT DISTINCT salary
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET 2   -- N = 3
) AS third_highest;

Warum der Trick mit der skalaren Unterabfrage funktioniert

Zwei Regeln führen gemeinsam zum gewünschten Verhalten:

  • Eine skalare Unterabfrage darf höchstens einen Wert zurückgeben. Wenn sie keine Zeilen zurückgibt, setzt SQL stattdessen NULL ein.
  • Das äußere SELECT ohne FROM oder mit einer Quelle mit genau einer Zeile gibt immer genau eine Zeile aus.

Wenn die innere Abfrage also den N-ten Wert findet, erhalten Sie diesen; wenn sie nichts findet, erhalten Sie eine Zeile mit NULL. Genau das entspricht der vom Interviewer genannten Anforderung.

Lösung 1 mit der DENSE_RANK-Variante

Dieselbe Umhüllung funktioniert auch für die Lösung mit einer Fensterfunktion. Platzieren Sie die Abfrage mit dem Ranking in der skalaren Unterabfrage. Wenn keine Zeile den Rang N hat, liefert die Unterabfrage NULL, und das äußere SELECT gibt trotzdem eine Zeile zurück.

SELECT (
  SELECT salary
  FROM (
    SELECT salary,
           DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
    FROM employee
  ) t
  WHERE rnk = 3
) AS third_highest;

Lösung 2: MAX liefert NULL automatisch

Erinnern Sie sich an den MAX-unter-MAX-Ansatz aus Lektion 1. Ein Aggregat über null Zeilen liefert NULL und erzeugt trotzdem eine Zeile. Für den zweithöchsten Wert ist dies ein sauberer Einzeiler, der die NULL-Anforderung bereits erfüllt.

Der Nachteil: Das Verschachteln von reinem MAX für ein beliebiges N wird unübersichtlich. Daher eignet sich dieser Ansatz am besten speziell für den zweithöchsten Wert.

SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);

Lösung 3: COALESCE mit einem Ersatzwert

Wenn Ihre Umgebung eine Zeile garantiert, der Wert aber aus einem anderen Grund fehlen könnte, können Sie das Ergebnis mit COALESCE umschließen, um einen expliziten Standardwert bereitzustellen.

Beachten Sie: COALESCE hilft erst, wenn eine Zeile vorhanden ist. Es macht aus einer leeren Ergebnismenge keine Zeile. Kombinieren Sie es daher mit der skalaren Unterabfrage als Umhüllung, die eine Zeile garantiert, und wenden Sie anschließend COALESCE auf den Wert an, wenn Sie etwas anderes als NULL wünschen, zum Beispiel 0.

SELECT COALESCE((
  SELECT DISTINCT salary
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET 2
), 0) AS third_highest_or_zero;

Was das Problem NICHT löst

Seien Sie vorsichtig bei Lösungen, die richtig aussehen, aber nicht funktionieren:

  • Wenn Sie COALESCE direkt um eine Abfrage legen, die null Zeilen zurückgibt, bewirkt das nichts; es gibt keine Zeile, auf die COALESCE angewendet werden könnte.
  • IFNULL und ISNULL haben dieselbe Einschränkung wie COALESCE.
  • Das Hinzufügen von LIMIT 1 erzeugt keine Zeile, wenn keine Zeile die Bedingung erfüllt.

Das Problem der Zeilenanzahl muss mit der skalaren Unterabfrage als Umhüllung oder mit einem Aggregat gelöst werden, nicht allein mit Funktionen zur Ersetzung von NULL-Werten.

Beispiel: Der 3. Wert bei nur zwei Werten

Gehälter: 500, 500, 300. Es gibt nur die unterschiedlichen Gehälter 500 und 300, daher existiert kein dritthöchstes Gehalt.

  • Normales DENSE_RANK mit WHERE rnk = 3: gibt null Zeilen zurück. Die Spezifikation wird nicht erfüllt.
  • Umhüllung durch eine skalare Unterabfrage: Die innere Abfrage findet nichts, daher gibt das äußere SELECT eine Zeile mit NULL zurück. Die Spezifikation wird erfüllt.
  • COALESCE(..., 0): gibt eine Zeile mit 0 zurück, wenn ein numerischer Standardwert verlangt wurde.

Im Interview den Lösungsweg erläutern

Sammeln Sie Punkte, indem Sie Ihr Vorgehen erläutern:

  • „Die naive Abfrage liefert eine leere Ergebnismenge, nicht NULL. Deshalb bette ich sie in eine skalare Unterabfrage ein, um eine Zeile zu garantieren.“
  • „Eine skalare Unterabfrage ohne passende Zeilen wird zu NULL ausgewertet. Das entspricht genau der Anforderung.“
  • „Wenn Sie statt NULL einen Standardwert wie 0 bevorzugen, füge ich um die Unterabfrage herum COALESCE hinzu.“

Der entscheidende Punkt dieser Frage ist zu zeigen, dass Sie die unterschiedliche Semantik von Zeilenanzahl und Wert verstehen.

Alles zusammenführen

Eine robuste, parametrisierbare Lösung für das N-höchste Gehalt oder NULL: Ranken Sie die unterschiedlichen Gehälter, filtern Sie innerhalb einer skalaren Unterabfrage nach Rang N und lassen Sie das äußere SELECT eine einzelne Zeile garantieren.

Diese eine Abfrage behandelt Duplikate mit DENSE_RANK, lässt sich auf jedes N verallgemeinern und gibt ordnungsgemäß NULL zurück, wenn N die Anzahl der unterschiedlichen Gehälter überschreitet.

SELECT (
  SELECT salary
  FROM (
    SELECT salary,
           DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
    FROM employee
  ) t
  WHERE rnk = :n
  LIMIT 1
) AS nth_highest;

Schnelltest

Überlegen Sie, wie sich Zeilenanzahl und NULL-Werte unterscheiden.

Zusammenfassung

Wenn N die verfügbaren unterschiedlichen Gehälter überschreitet, gibt eine normale Ranking-Abfrage eine leere Ergebnismenge und nicht NULL zurück.

  • Umschließen Sie die Abfrage für das N-höchste Gehalt in einer skalaren Unterabfrage innerhalb eines äußeren SELECT. So wird immer eine Zeile erzeugt, deren Wert NULL ist, wenn kein Wert passt.
  • Die Form MAX-unter-MAX gibt im Fall des zweithöchsten Gehalts automatisch NULL zurück.
  • COALESCE ersetzt einen Wert erst, wenn eine Zeile vorhanden ist; aus null Zeilen kann es keine eine Zeile machen.

Unterscheiden Sie immer zwischen Zeilenanzahl und Wert, wenn ein Interviewer eine elegante Behandlung von NULL verlangt.

Häufig gestellte Fragen

Ist die Lektion „NULL zurückgeben, wenn kein n-ter Wert existiert“ kostenlos?

Ja — der vollständige Text von „NULL zurückgeben, wenn kein n-ter Wert existiert“ 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 „NULL zurückgeben, wenn kein n-ter Wert existiert“?

Den von Interviewern beliebten Sonderfall elegant behandeln, wenn zu wenige Zeilen vorhanden 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 4 von 4.

Wie lange dauert die Lektion „NULL zurückgeben, wenn kein n-ter Wert existiert“?

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. Das zweithöchste Gehalt auf fünf Arten
  2. Der n-höchste Wert mit DENSE_RANK
  3. Der Spitzenverdiener je Abteilung
  4. NULL zurückgeben, wenn kein n-ter Wert existiert
← Zurück zu SQL Interview Prep