EXISTS
Unterabfragen & Fortgeschrittenes
Bedeutung
Der Operator EXISTS prüft, ob eine Unterabfrage (Subquery) mindestens eine Zeile zurückgibt. Das Ergebnis ist immer ein Wahrheitswert: TRUE, wenn die Subquery Zeilen liefert, sonst FALSE. Es kommt nicht auf die Werte der Subquery an, nur darauf, ob es Treffer gibt.
Korrelierte Subquery
EXISTS nutzt man meist mit einer korrelierten Subquery: Die innere Abfrage bezieht sich auf eine Spalte der äußeren Abfrage. Für jede äußere Zeile wird die innere Abfrage erneut geprüft.
Syntax
SELECT spalten FROM tabelleA a WHERE EXISTS ( SELECT 1 FROM tabelleB b WHERE b.fk = a.id );
Im Subquery-SELECT schreibt man oft SELECT 1 – der Wert ist egal, gezählt wird nur die Existenz von Zeilen.
Beispiel: Kunden, die mindestens einmal bestellt haben
SELECT k.Name FROM Kunden k WHERE EXISTS ( SELECT 1 FROM Bestellungen b WHERE b.KundenID = k.KundenID );
| Name |
|---|
| Müller GmbH |
| Schmidt AG |
Dupont SARL hat keine Bestellung – für diesen Kunden liefert die Subquery keine Zeile, also wird er ausgelassen.
NOT EXISTS
Mit NOT EXISTS kehrst du die Logik um und findest Kunden ohne Bestellung:
SELECT k.Name FROM Kunden k WHERE NOT EXISTS ( SELECT 1 FROM Bestellungen b WHERE b.KundenID = k.KundenID );
Was liefert EXISTS zurück?
Hinweis
EXISTS ist oft effizienter als ein IN mit Subquery, weil die Datenbank beim ersten Treffer abbrechen kann. Für Vergleiche mit einer ganzen Wertemenge schau dir ANY und ALL an.