Las subconsultas son legales en la cláusula
FROM
de un comando
SELECT
. La sintaxis que vería es:
SELECT ... FROM (subquery
) [AS]name
...
La cláusula [AS]
es obligatoria, ya
que cada tabla en la cláusula name
FROM
debe
tener un nombre. Cualquier columna en la lista selecta de la
subquery
debe tener nombre único.
Puede encontrar esta sintaxis descrita en este manual, dónde
se usa el término “tablas derivadas.”
Asuma que tiene la tabla:
CREATE TABLE t1 (s1 INT, s2 CHAR(5), s3 FLOAT);
Aquí se muestra cómo usar una subconsulta en la cláusula
FROM
usando la tabla de ejemplo:
INSERT INTO t1 VALUES (1,'1',1.0); INSERT INTO t1 VALUES (2,'2',2.0); SELECT sb1,sb2,sb3 FROM (SELECT s1 AS sb1, s2 AS sb2, s3*2 AS sb3 FROM t1) AS sb WHERE sb1 > 1;
Resultado: 2, '2', 4.0
.
Aquí hay otro ejemplo: suponga que quiere conocer la media de un conjunto de sumas para una tabla agrupada. Esto no funcionaría:
SELECT AVG(SUM(column1)) FROM t1 GROUP BY column1;
Sin embargo, esta consulta proporciona la información deseada:
SELECT AVG(sum_column1) FROM (SELECT SUM(column1) AS sum_column1 FROM t1 GROUP BY column1) AS t1;
Tenga en cuenta que el nombre de columna usado dentro de la
subconsultas (sum_column1)
se reconoce en
la consulta exterior.
Las subconsultas en la cláusula FROM
pueden retornar un escalar, columna, registro o tabla. De
momento, las subconsultas en la cláusula
FROM
no pueden ser subconsultas correladas.
Las subconsultas en la cláusula FROM
se
ejecutan incluso para el comando EXPLAIN
(esto es, se construyen las tablas temporales derivadas). Esto
ocurre porque las consultas de niveles superiores necesitan
información acerca de todas las tablas durante la fase de
optimización.
É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.