Wenn eine Unterabfrage irgendwelche Datensätze zurückgibt,
ist EXISTS
wahr und
subquery
NOT EXISTS
ist falsch. Zum
Beispiel:
subquery
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
Traditionell beginnt eine
EXISTS
-Unterabfrage mit SELECT
*
, sie könnte aber auch mit SELECT
5
oder SELECT column1
oder etwas
ganz anderem anfangen: MySQL ignoriert die
SELECT
-Liste in einer solchen Unterabfrage,
mithin macht es keinen Unterschied.
Bei obigem Beispiel ist die Bedingung wahr, wenn
t2
überhaupt Datensätze enthält (und
sogar dann, wenn es sich ausschließlich um
NULL
-Werte handelt). Dies ist aber ein
recht abwegiges Beispiel, weil eine [NOT]
EXISTS
-Unterabfrage fast immer Korrelationen
enthält. Hier einige pragmatischere Beispiele:
Welche Arten von Geschäften sind in einer oder mehreren Städten vorhanden?
SELECT DISTINCT store_type FROM stores WHERE EXISTS (SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type);
Welche Art von Geschäften ist in keiner Stadt vorhanden?
SELECT DISTINCT store_type FROM stores WHERE NOT EXISTS (SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type);
Welche Art von Geschäften ist in allen Städten vorhanden?
SELECT DISTINCT store_type FROM stores s1 WHERE NOT EXISTS ( SELECT * FROM cities WHERE NOT EXISTS ( SELECT * FROM cities_stores WHERE cities_stores.city = cities.city AND cities_stores.store_type = stores.store_type));
Das letzte Beispiel ist eine doppelt verschachtelte
NOT EXISTS
-Abfrage: Sie enthält eine
NOT EXISTS
-Klausel in einer NOT
EXISTS
-Klausel. Formell beantwortet sie die Frage
„Gibt es eine Stadt mit einem Geschäft, das nicht in
Stores
vorhanden ist?“. Aber es ist
einfacher zu sagen, dass eine verschachtelte NOT
EXISTS
-Klausel die Frage „Ist
x
für alle
y
wahr?“ beantwortet.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.