Der SQL EXISTS Operator überprüft, welche Werte sich innerhalb von zwei Abfragen überschneiden.

SELECT Spalte 
FROM Tabelle
WHERE EXISTS(Abfrage) 
SQL EXISTS

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.

ARTIKEL TEILEN

Hast du Fragen? Hinterlasse einen Kommentar!