QU ES?
Es un comando SELECT dentro de otro comando SELECT.
SELECT * FROM t1 WHERE column1 = (SELECT column1
FROM t2);
Una subconsulta esta anidad en una consulta externa, de
hecho una subconsulta puede contener otras subconsultas
hasta una profundidad considerable. Las subconsultas
siempre deben aparecer entre parntesis.
VENTAJAS
Permiten consultas estructuradas de forma que es
CARACTERSTICAS
RESTRICCIONES
SUBCONSULTAS EN CONSULTAS
operando_no_subconsulta operador_comparador
(subconsulta)
He aqu un ejemplo de una comparacin comn de subconsultas que no
puede hacerse mediante un JOIN. Encuentra todos los valores en la tabla t1
que son iguales a un valor mximo en la tabla t2:
SELECT column1 FROM t1 WHERE column1 = (SELECT MAX(column2)
FROM t2);
ANY significa return TRUE si la comparacin es TRUE para ANY (cualquiera) de los valores en la
columna que retorna la subconsulta.
TRUE
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
UNKNOWN
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);
UNKNOWN
SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);
SUBCONSULTAS DE REGISTRO
SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2);
SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2
FROM t2);
(1,2), ROW(1,2) -> constructores de registros
SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3)
IN
(SELECT column1,column2,column3
FROM t2);
SUBCONSULTAS CORRELACIONADAS
Una subconsulta correlacionada es una subconsulta que
contiene una referencia a una tabla que tambin aparece en
la consulta exterior.
SELECT * FROM t1 WHERE column1 = ANY
(SELECT column1 FROM t2 WHERE t2.column2 =
t1.column2);
ERRORES EN SUBCONSULTAS
Nmero incorrecto de columnas de la subconsulta:
ERROR 1241 (ER_OPERAND_COL)
SQLSTATE = 21000
Message = "Operand should contain 1 column(s)
SELECT (SELECT column1, column2 FROM t2) FROM t1;
OPTIMIZAR SUBCONSULTAS
Usar clusulas de subconsulta que afecten al nmero u orden de los registros en la
subconsulta.
SELECT * FROM t1 WHERE t1.column1 IN
(SELECT column1 FROM t2 ORDER BY column1);
SELECT * FROM t1 WHERE t1.column1 IN
(SELECT DISTINCT column1 FROM t2);
SELECT * FROM t1 WHERE EXISTS
(SELECT * FROM t2 LIMIT 1);
x=2.
Use = ANY en lugar de EXISTS.
Para subconsultas no correlacionadas que siempre
retornan un registro, IN siempre es ms lento que =.
GRACIAS