Si une sous-requête retourne absolument aucune valeur, alors
la clause EXISTS <subquery>
est
TRUE
, et la clause NOT EXISTS
<subquery>
est FALSE
. Par
exemple :
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
Traditionnellement, une sous-requête qui
EXISTS
commence avec SELECT
*
mais elle peut commencer aussi bien avec
SELECT 5
ou SELECT
column1
ou n'importe quoi d'autre encore : MySQL
ignore la liste de colonnes du SELECT
de
cette requête, ce qui fait que cela n'a pas d'importance.
Dans l'exemple ci-dessus, si la table t2
ne
contient aucune ligne, même pas de ligne avec uniquement des
valeurs NULL
, alors la condition
EXISTS
est TRUE
. C'est
un exemple plutôt exceptionnel, car il y a presque toujours
une sous-requête [NOT] EXISTS
qui
contiendra des corrélations. Voici des exemples plus
concrets :
Quel type de magasin est le plus fréquent dans une ou plusieurs villes?
SELECT DISTINCT store_type FROM Stores WHERE EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type);
Quel type de magasin n'est présent dans aucune villes?
SELECT DISTINCT store_type FROM Stores WHERE NOT EXISTS (SELECT * FROM Cities_Stores WHERE Cities_Stores.store_type = Stores.store_type);
Quel type de magasin est présent dans toutes les villes?
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));
Le dernier exemple est une double imbrication de requête
NOT EXISTS
: elle possède une clause
NOT EXISTS
à l'intérieur de la clause
NOT EXISTS
. Formellement, elle répond à
la question : ``Existe-t-il une ville avec un magasin qui
n'est pas dans Stores?''. Mais il est plus facile de dire
qu'une clause NOT EXISTS
imbriquée répond
à la question ``est-ce que x est vrai pour tous les y?''.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.