Sous-requêtes avec ALL
<<<
Sous-requêtes correllées EXISTS et NOT EXISTS
>>>

14.1.8 Sous sélections (Sub SELECT )
14.1 Manipulation de données : SELECT , INSERT , UPDATE , DELETE
14 Syntaxe des commandes SQL
 Manuel de Référence MySQL 4.1 : Version Française

Les sous-requêtes comme opérateur scalaire
Comparaisons avec les sous-requêtes
Sous-requêtes avec les clauses ANY , IN et SOME
Sous-requêtes avec ALL
->Sous-requêtes correllées
EXISTS et NOT EXISTS
Sous-requêtes de ligne
Sous-requêtes dans la clause FROM
Erreurs de sous-requêtes
Optimisation des sous-requêtes
Se passer des sous-requêtes avec les premières versions de MySQL

14.1.8.5 Sous-requêtes correllées

Une sous-requête correllée est une sous-requête qui contient une référence à une colonne qui est aussi dans une requête différente.

Par exemple :


SELECT * FROM t1 WHERE column1 = ANY
       (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
Notez que dans notre exemple, la sous-requête contient une référence à une colonne de la table t1 , même si la sous-requête de la clause FROM ne mentionne pas la table t1 . MySQL recherche hors de la requête et trouve t1 dans la requête externe.

Supposez que la table t1 contienne une ligne où column1 = 5 et column2 = 6 ; alors que la table t2 continne une ligne où column1 = 5 et column2 = 7 . l'expression ... WHERE column1 = ANY (SELECT column1 FROM t2) sera alors TRUE , mais dans cet exemple, la clause WHERE de la sous-requête est FALSE (car 7 <> 5), et donc, toute la sous-requête est FALSE .

Règles de contexte : MySQL fait les évaluations de l'intérieur vers l'extérieur. Par exemple :

SELECT column1 FROM t1 AS x
  WHERE x.column1 = (SELECT column1 FROM t2 AS x
    WHERE x.column1 = (SELECT column1 FROM t3 WHERE x.column2 = t3.column1));
Dans l'exemple ci-dessus, x.column2 doit être une colonne de la table t2 car SELECT column1 FROM t2 AS x ... prend le nom de t2 . ce n'est pas une colonne de la table t1 car SELECT column1 FROM t1 ... est une requête externe, qui est à venir .Pour les sous-requêtes placées dans des clauses HAVING ou ORDER BY , MySQL recherche aussi les noms de colonnes dans la liste des sélections externes.

La recommandation officieuse de MySQL est : évitez les correllations, car votre requête sera complexe et plus lente.

<< Sous-requêtes correllées >>
Sous-requêtes avec ALL Sous sélections (Sub SELECT ) EXISTS et NOT EXISTS