Der SQL EXISTS Operator überprüft, welche Werte sich innerhalb von zwei Abfragen überschneiden.
SELECT Spalte
FROM Tabelle
WHERE EXISTS(Abfrage)
Der SQL EXISTS Operator führt die Abfrage nur aus, wenn Werte in der Subquery sich mit der Hauptabfrage überschneiden. Der Teil EXISTS(Subquery) ist TRUE, wenn die Subquery mindestens eine Zeile ausgibt. Ist die Subquery leer, d.h. keine einzige Zeile wird ausgegeben, ist die Bedingung FALSE und die äußere Abfrage wird nicht ausgeführt.
SQL EXISTS - Beispiel
In einem Fall mit zwei Kategorien und zehn Millionen Produkten:
EXISTS sucht in Kategorie 1 in der Spalte Produkte, bis es einen Wert findet und stoppt daraufhin in der Kategorie 1. Dann sucht EXISTS in Kategorie 2 nach Produkten, bis es einen Wert findet und stoppt erneut.
SELECT Produktkategorie-Name
FROM Kategorien
WHERE EXISTS(SELECT *
FROM Produkte
WHERE Produkte.KategorieID = Kategorien.KategorieID);
Derselbe Prozess lässt sich auch über eine JOIN Abfrage ausführen. Die JOIN Funktion mit DISTINCT verbindet die beiden Kategorien mit allen zehn Millionen Produkten miteinander. Im Anschluss werden die 9.999.998 Duplikate entfernt. Diese Abfrage ist also deutlich langsamer, bietet durch den JOIN allerdings mehr Möglichkeiten Daten auszugeben. Bei vielen Duplikaten oder zur einfachen Überprüfung der Existenz von gewissen Werten, ist die JOIN Abfrage in der Regel nicht zu empfehlen.
SELECT DISTINCT Produktkategorie-Name
FROM Kategorien
JOIN Produkte
ON Produkte.KategorieID = Kategorien.KategorieID;
Anstelle von EXISTS kann in diesem Fall auch der IN Operator benutzt werden. Dieser führt zuerst die gesamte Subquery und danach erst die äußere Query aus.
SELECT Produktkategorie-Name
FROM Kategorien
WHERE KategorieID
IN (SELECT KategorieID FROM Produkte);
Mit EXISTS gibt die Datenbank nur die Bool-Werte TRUE oder FALSE aus. Das heißt, dieser Befehl performt in der Regel besser als der IN Befehl (außer die Tabelle in der Subquery ist sehr klein). Allerdings muss beachtet werden, dass EXISTS für gewöhnlich schlechter performt, wenn der NOT Operator (NOT EXISTS) verwendet wird. Wenn Kategorie 2 nicht in der Produkte-Tabelle existiert, müssen alle zehn Millionen Produkte durchgegangen werden, um das zu bestätigen.
SELECT Produktkategorie-Name
FROM Kategorien
WHERE NOT EXISTS(SELECT *
FROM Produkte
WHERE Produkte.KategorieID = Kategorien.KategorieID);
Die oben genannten Empfehlungen zur Anwendung sind allerdings nicht als Dogma, sondern als Simplifizierung zu sehen. Es kann immer Fälle geben, bei denen die Empfehlungen gegenteilig besser performen.