13.2.11.6 Unterabfragen mit EXISTS oder NOT EXISTS
Wenn eine Unterabfrage überhaupt eine Zeile zurückgibt, EXISTS
ist subquery
TRUE
, und NOT EXISTS
ist subquery
FALSE
. Ein Beispiel:
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
Traditionell beginnt eine EXISTS
-Subquery mit SELECT *
, aber sie könnte mit SELECT 5
oder SELECT column1
oder mit irgendetwas anderem beginnen. MySQL ignoriert die SELECT
-Liste in einer solchen Unterabfrage, es macht also keinen Unterschied.
Für das vorangegangene Beispiel, wenn t2
irgendwelche Zeilen enthält, sogar Zeilen mit nichts als NULL
Werten, ist die EXISTS
Bedingung TRUE
. Dies ist eigentlich ein unwahrscheinliches Beispiel, da eine EXISTS
-Subquery fast immer Korrelationen enthält. Hier sind einige realistischere Beispiele:
-
Welches Geschäft gibt es in einer oder mehreren Städten?
SELECT DISTINCT store_type FROM stores WHERE EXISTS (SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type);
-
Welche Art von Geschäft 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);
-
Welches Geschäft ist in allen Städten vertreten?
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. Das heißt, sie hat eine NOT EXISTS
Klausel innerhalb einer NOT EXISTS
Klausel. Formal beantwortet es die Frage „Gibt es eine Stadt mit einem Geschäft, das nicht in Stores
ist“? Aber es ist einfacher zu sagen, dass ein verschachteltes NOT EXISTS
die Frage beantwortet „ist x
TRUE
für alle y
?“
Ab MySQL 8.0.19 können Sie in der Subquery auch NOT EXISTS
oder NOT EXISTS
mit TABLE
verwenden, etwa so:
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
Das Ergebnis ist dasselbe wie bei der Verwendung von SELECT *
ohne WHERE
-Klausel in der Subquery.