SQL EXISTS prüft, ob eine Subquery mindestens eine Zeile liefert – und gibt dafür nur TRUE oder FALSE zurück. EXISTS eignet sich besonders für korrelierte Subqueries, also Abfragen, die auf Spalten der äußeren Abfrage zugreifen.

So funktioniert EXISTS

SELECT name FROM kunden k
WHERE EXISTS (SELECT 1 FROM bestellungen b
              WHERE b.kunden_id = k.id);

Für jede Zeile der äußeren Abfrage wird die Subquery ausgewertet. Findet sie mindestens eine passende Zeile, gilt die Bedingung als erfüllt – der Inhalt der Subquery-Spalten spielt keine Rolle, deshalb ist SELECT 1 üblich.

EXISTS vs. IN – die NULL-Falle

EXISTS und IN wirken ähnlich, unterscheiden sich aber bei NULL: NOT IN mit einer Liste, die einen NULL-Wert enthält, liefert kein einziges Ergebnis (das Ergebnis ist weder TRUE noch FALSE, sondern unbekannt). NOT EXISTS dagegen behandelt NULL-Werte korrekt und bleibt die sichere Wahl.

Performance

  • Viele Datenbanken optimieren EXISTS zu einem Semi-Join und stoppen, sobald die erste passende Zeile gefunden ist – bei großen Tabellen oft schneller als IN mit langer Liste.
  • NOT EXISTS ist die klassische Anti-Join-Technik und meist effizienter als NOT IN.
  • Für reine Vergleichsabfragen ohne Existenzprüfung ist ein JOIN oft die bessere Wahl.

Mengenoperatoren wie INTERSECT und EXCEPT vergleichen komplette Ergebnismengen; EXISTS fragt dagegen pro Zeile nach dem Vorhandensein passender Datensätze.

Grundlagen zu Abfragen finden sich unter SQL-Grundlagen.