Wenn eine Unterabfrage irgendwelche Datensätze zurückgibt,
ist EXISTS
wahr und
subqueryNOT 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.
