Articles

MySQL :: MySQL 8.0 Referenzhandbuch :: 13.2.11.6 Unterabfragen mit EXISTS oder NOT EXISTS

Posted on

13.2.11.6 Unterabfragen mit EXISTS oder NOT EXISTS

Wenn eine Unterabfrage überhaupt eine Zeile zurückgibt, EXISTS subquery ist TRUE, und NOT EXISTS subquery ist 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 xTRUE 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.