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

14.1.8 Sous-sélections ( SubSELECT )
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 corrélé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 corrélées

Une sous-requête corrélé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 continue 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.

Dans certains cas, les sous-requêtes corrélées sont optimisées. Par exemple :


val IN (SELECT key_val FROM tbl_name WHERE correlated_condition)
Sinon, elles sont inefficaces et plutôt lentes. Réécrire une requête sous forme de jointure peut améliorer les performances.

<< Sous-requêtes corrélées >>
Sous-requêtes avec ALL Sous-sélections ( SubSELECT ) EXISTS et NOT EXISTS