0Pricing
Coding Interview Prep · Lektion

Korrelierte EXISTS- und NOT-EXISTS-Abfragen

Die robuste Anti-Join-Alternative, die NULL-Werte korrekt behandelt

Korrelierte EXISTS- und NOT-EXISTS-Abfragen ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 3 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 Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

EXISTS prüft das Vorhandensein

EXISTS nimmt eine Unterabfrage entgegen und gibt TRUE zurück, sobald diese Unterabfrage mindestens eine Zeile liefert, andernfalls FALSE. Die Zeilen selbst werden niemals zurückgegeben.

Mit einer korrelierten Unterabfrage wird EXISTS zu einer Prüfung des Vorhandenseins pro äußerer Zeile: „Gibt es eine passende Zeile für diese äußere Zeile?“

Da die Suche beim ersten Treffer abgebrochen wird, spielt es keine Rolle, wie viele Zeilen passen. Diese semantische Feinheit ist ein beliebter Punkt im Vorstellungsgespräch.

Ein einfaches korreliertes EXISTS

Finden Sie Kunden, die mindestens eine Bestellung aufgegeben haben. Die innere Abfrage ist über o.customer_id = c.customer_id korreliert.

Für jeden Kunden fragt EXISTS: Gibt es eine Bestellung für diesen Kunden? Wenn ja, wird der Kunde beibehalten.

SELECT c.customer_id, c.name
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
);

Warum SELECT 1 in EXISTS verwendet wird

In EXISTS sehen Sie SELECT 1, SELECT * oder SELECT NULL. Sie sind alle gleichwertig.

EXISTS prüft nur, ob Zeilen zurückgegeben werden, niemals deren Inhalt. Daher sind die ausgewählten Spalten unerheblich. Der Optimierer ignoriert sie.

SELECT 1 ist eine verbreitete Konvention, die die Absicht verdeutlicht: „Mich interessiert nur, ob etwas vorhanden ist.“ Entscheiden Sie sich für eine Variante und bleiben Sie dabei konsistent. Der Interviewer soll nicht denken, dass die Spaltenliste hier eine Rolle spielt.

NOT EXISTS findet fehlende Einträge

NOT EXISTS kehrt die Prüfung um: Die äußere Zeile wird nur beibehalten, wenn die korrelierte Unterabfrage keine Zeilen zurückgibt.

Dies ist der klassische Anti-Join: Kunden ohne Bestellungen, nie verkaufte Produkte oder Studierende ohne Abgaben.

SELECT c.customer_id, c.name
FROM customers c
WHERE NOT EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
);

Die NULL-Falle bei NOT IN

Hier liegt ein besonders wichtiger Punkt im Vorstellungsgespräch. NOT IN gegenüber einer Unterabfrage, die NULL enthalten kann, verhält sich tückisch: Wenn die Liste auch nur ein NULL enthält, gibt NOT IN überhaupt keine Zeilen zurück.

Das liegt daran, dass ein Vergleich mit NULL UNKNOWN ergibt und NOT IN voraussetzt, dass jeder Vergleich FALSE ist. Ein einziges UNKNOWN verunreinigt die gesamte Bedingung.

NOT EXISTS hat dieses Problem nicht. Es prüft einfach das Vorhandensein von Zeilen und behandelt NULL sicher.

-- Risky: returns nothing if any o.customer_id is NULL
SELECT c.customer_id FROM customers c
WHERE c.customer_id NOT IN (SELECT o.customer_id FROM orders o);

-- Safe: NULLs do not break it
SELECT c.customer_id FROM customers c
WHERE NOT EXISTS (
    SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id
);

Warum NOT EXISTS NULL-sicher ist

Der Grund liegt in der Vergleichslogik. NOT EXISTS prüft, ob eine innere Zeile die Bedingung o.customer_id = c.customer_id erfüllt.

Eine Zeile, in der o.customer_id NULL ist, erfüllt diese Gleichheit niemals. NULL = beliebiger Wert ergibt UNKNOWN und nicht TRUE, daher zählt die Zeile einfach nicht als Treffer. Die Prüfung des Vorhandenseins bleibt korrekt.

Bei NOT IN wird dasselbe NULL hingegen Teil eines Listenvergleichs, dessen UNKNOWN-Ergebnis die gesamte Ausgabe unterdrückt. Deshalb bevorzugen erfahrene Interviewer NOT EXISTS.

EXISTS mit zusätzlichen Bedingungen

Die korrelierte Unterabfrage kann weitere Prädikate enthalten. Finden Sie Kunden, die mindestens eine Bestellung über 1000 aufgegeben haben.

Die zusätzliche Bedingung befindet sich innerhalb der EXISTS-Unterabfrage und wird für jeden Kunden separat ausgewertet.

SELECT c.customer_id, c.name
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
      AND o.amount > 1000
);

Performance: Kurzschlussverhalten

EXISTS kann das Scannen der inneren Relation beenden, sobald eine passende Zeile gefunden wurde. Es erstellt oder zählt keine vollständige Ergebnismenge.

Dadurch ist EXISTS in der Regel effizient, insbesondere wenn die korrelierte Spalte indiziert ist, da jede zeilenweise Suche schnell einen Treffer finden und anschließend abbrechen kann.

Vergleichen Sie dies mit einem korrelierten COUNT(*) > 0, bei dem jeder Treffer gezählt werden muss. Bevorzugen Sie EXISTS, wenn Sie nur eine Ja/Nein-Antwort benötigen.

EXISTS vs. COUNT zum Prüfen des Vorhandenseins

Bewerber schreiben manchmal eine korrelierte Zählung, um das Vorhandensein zu prüfen. Das funktioniert, verursacht aber unnötigen Aufwand.

Die COUNT-Variante zählt jede passende Bestellung; EXISTS beendet die Suche nach der ersten. Für eine reine Existenzprüfung vermittelt EXISTS die Absicht klarer und ermöglicht dem Abfrageoptimierer einen vorzeitigen Abbruch.

-- Works but counts everything
SELECT c.customer_id FROM customers c
WHERE (SELECT COUNT(*) FROM orders o
       WHERE o.customer_id = c.customer_id) > 0;

-- Better: stops at first match
SELECT c.customer_id FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o
              WHERE o.customer_id = c.customer_id);

Durchgespieltes Beispiel: Produkte, die nie bestellt wurden

Eine klassische Anti-Join-Frage im Vorstellungsgespräch: Listen Sie Produkte auf, die noch nie bestellt wurden. NOT EXISTS entspricht dabei fast genau der englischen Anforderung.

Prüfen Sie für jedes Produkt, ob eine Bestellposition darauf verweist, und behalten Sie nur die Produkte ohne einen solchen Verweis.

SELECT p.product_id, p.name
FROM products p
WHERE NOT EXISTS (
    SELECT 1
    FROM order_items oi
    WHERE oi.product_id = p.product_id
);

EXISTS in NOT EXISTS für Abfragen im Stil der relationalen Division

Das Verschachteln von EXISTS in NOT EXISTS drückt eine relationale Division aus: „Finden Sie Zeilen, die zu allen Elementen einer Menge passen.“ Eine klassische Aufgabe lautet: „Kunden, die jedes Produkt einer Kategorie bestellt haben.“

Die Logik: Behalten Sie einen Kunden, wenn es kein Produkt gibt, das er nicht bestellt hat. Diese doppelte Verneinung ist das Kennzeichen einer Divisionsabfrage, und Interviewer verwenden sie, um fundierte EXISTS-Kenntnisse zu prüfen.

SELECT c.customer_id
FROM customers c
WHERE NOT EXISTS (
    SELECT 1 FROM products p
    WHERE p.category = 'Coffee'
      AND NOT EXISTS (
          SELECT 1 FROM order_items oi
          JOIN orders o ON o.order_id = oi.order_id
          WHERE oi.product_id = p.product_id
            AND o.customer_id = c.customer_id
      )
);

Kurzer Check

Wählen Sie den sichersten Weg, um Kunden ohne Bestellungen zu finden.

Zusammenfassung: Korrelierte EXISTS- und NOT-EXISTS-Abfragen

Die wichtigsten Punkte:

  • EXISTS prüft das Vorhandensein pro Zeile und beendet die Suche beim ersten Treffer; welche Spalte Sie darin auswählen, ist unerheblich (verwenden Sie SELECT 1).
  • NOT EXISTS ist der NULL-sichere Anti-Join, um Zeilen ohne passenden Treffer zu finden.
  • NOT IN mit einem NULL-Wert in der Liste liefert nichts; bevorzugen Sie NOT EXISTS.
  • Für Existenzprüfungen ist EXISTS einem korrelierten COUNT(*) > 0 überlegen, weil die Suche frühzeitig beendet wird.

Erwähnen Sie die NULL-Falle von NOT IN ungefragt; das ist ein verlässliches Signal für SQL-Reife.

Häufig gestellte Fragen

Ist die Lektion „Korrelierte EXISTS- und NOT-EXISTS-Abfragen“ kostenlos?

Ja — der vollständige Text von „Korrelierte EXISTS- und NOT-EXISTS-Abfragen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Korrelierte EXISTS- und NOT-EXISTS-Abfragen“?

Die robuste Anti-Join-Alternative, die NULL-Werte korrekt behandelt Du übst Coding 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 Coding Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. Coding 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 3 von 4.

Wie lange dauert die Lektion „Korrelierte EXISTS- und NOT-EXISTS-Abfragen“?

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 Coding Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede Coding 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. Aufbau einer korrelierten Unterabfrage
  2. Aggregierte Werte pro Gruppe ohne GROUP BY
  3. Korrelierte EXISTS- und NOT-EXISTS-Abfragen
  4. Korrelierte Unterabfragen als JOINs umschreiben
← Zurück zu Coding Interview Prep