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.
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.