Una subconsulta correlacionada es una subconsulta que contiene una referencia a una tabla que también aparece en la consulta exterior. Por ejemplo:
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
Tenga en cuenta que la subconsulta contiene una referencia a
una columna de t1
, incluso aunque la
cláusula FROM
de la subconsulta no
menciona una tabla t1
. Por lo tanto, MySQL
busca fuera de la subconsulta y encuentra
t1
en la consulta externa.
Suponga que la tabla t1
contiene un
registro en que column1 = 5
y
column2 = 6
; mientras, la tabla
t2
contiene un registro en que
column1 = 5
y column2 =
7
. La expresión ... WHERE column1 = ANY
(SELECT column1 FROM t2)
sería
TRUE
, pero en este ejemplo, la cláusula
WHERE
dentro de la subconsulta es
FALSE
(ya que (5,6)
no
es igual a (5,7)
), así que la subconsulta
como un todo es FALSE
.
Regla de visibilidad: MySQL evalúa desde dentro hacia fuera. Por ejemplo:
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));
En este comando, x.column2
debe ser una
columna en la tabla t2
ya que
SELECT column1 FROM t2 AS x ...
renombra
t2
. No hay una columna en la tabla
t1
porque SELECT column1 FROM t1
...
es una consulta externa que está
demasiado afuera.
Para subconsultas en cláusulas HAVING
u
ORDER BY
, MySQL busca nombres de columna
en la lista de selección exterior.
Para ciertos casos, una subconsulta correlacionada es óptima. Por ejemplo:
val
IN (SELECTkey_val
FROMtbl_name
WHEREcorrelated_condition
)
De otro modo, son ineficientes y lentas. Reescribir la consulta como un join puede mejorar el rendimiento.
Las subconsultas correlacionadas no pueden referirse a los resultados de funciones agregadas de la consulta exterior.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.