Este documento describe las subconsultas SQL, definidas como instrucciones SQL anidadas dentro de otras instrucciones. Explica que pueden clasificarse según el número de filas y columnas que devuelven, y que se pueden usar en cláusulas como SELECT, WHERE, FROM. También cubre ejemplos de diferentes tipos de subconsultas como de una sola fila, múltiples filas, múltiples columnas, correlacionadas, anidadas y vistas en línea.
1. S QL SUBCONSULTAS
Subconsultas
Definición y clasificaciones
Donde emplearlas
Condiciones de comparación y subconsultas
Ejemplos
Definición y clasificaciones
Una subconsulta es una instrucción SQL llamada desde otra instrucción o desde otra
subconsulta. Las subconsultas pueden devolver varios conjuntos de resultados, pudiéndose
clasificar basándose en estos conjuntos como:
Una fila/una columna
Múltiples filas/una única columna
Múltiples columnas/una única o múltiples filas
Una subconsulta puede tener un formato regular o correlacionado.
Subconsulta regular.
Un consulta contenida dentro de otra sin que haya relación entre ambas.
Subconsulta correlacionadas:
Correlacionado implica una conexión entre la consulta –o subconsulta- que
invoca la subconsulta y la propia subconsulta. Hay que tener en cuenta, que la
columna correlacionada puede ser pasada de la consulta superior (la externa)
a la inferior (la subconsulta interna) y NO al revés. La subconsulta
correlacionada depende siempre de la consulta externa.
Las subconsultas pueden definirse también como anidadas o vistas en línea.
Subconsulta anidada:
Las subconsultas pueden llamar a otras subconsultas, y estas a su vez a
otras, así sucesivamente, sin limitación.
Subconsulta vista en línea:
Es una subconsulta embebida dentro de la cláusula FROM de la instrucción
SELECT que invoca la subconsulta.
Las subconsultas pueden pertenecer a la combinación de varios tipos de clasificaciones.
Donde emplearlas
Las subconsultas pueden emplearse en casi todas las instrucciones SQL, en cualquier
comando SQL donde se pueda emplear una expresión. El siguiente listado muestra las
instrucciones SQL donde puede emplearse una subconsulta:
Cláusula SELECT
Cláusula WHERE
Cláusula ORDER BY
Cláusula FROM (vista en línea)
CURSO 2005-06 19
2. S QL SUBCONSULTAS
Cláusula VALUES de la instrucción INSERT
Cláusula SET de la instrucción UPDATE
Condiciones de comparación y subconsultas
Las subconsultas pueden aplicarse a muchas condiciones de comparación. Dependiendo del
tipo de operador que empleemos, estará permitido un tipo de subconsulta u otro, en función
del tipo de resultados que esta devuelva.
SIMPLE (subconsulta) {= | != } (subconsulta)
LIKE (subconsulta) LIKE (subconsulta)
PERTENENCIA (subconsulta)[NOT] IN (subconsulta)
EXISTENCIA [NOT] EXIST (subconsulta)
RANGO (subconsulta) BETWEEN (subconsulta) AND (subconsulta)
AGRUPACIÓN (subconsulta) {= | != | > | < | >= | <= } {ANY | SOME | ALL}
(subconsulta)
Los operadores marcados, requieren subconsultas que devuelvan una única fila, como son
la igualdad/desigualdad, los operadores de comparación (<,>,>=,<=), así como los
operadores LIKE y BETWEEN.
El resto de operadores permiten como resultado de la subconsulta múltiples filas: IN, NOT
IN, EXIST, NOT EXIST, además de los operadores de comparación combinados con ANY,
SOME o ALL.
Una subconsulta en si misma, es generalmente equivalente sintácticamente a una
instrucción SELECT.
Ejemplos:
A continuación vamos a ver unos ejemplos de subconsultas:
Subconsultas de una única fila:
Es una subconsulta que devuelve como resultado una única fila.
Ejemplo:
SELECT *
FROM estudiantes
WHERE población= (SELECT población
FROM estudiantes
WHERE dni=’33445667’);
Subconsultas de una múltiples filas:
Son subconsultas que devuelven como resultado múltiples filas. Es importante tener en
cuenta que pueden no devolver ninguna fila, y que el conjunto vacío es un resultado válido
en la pertenencia, existencia o condiciones de agrupación de comparación.
20 CURSO 2005-06
3. S QL SUBCONSULTAS
Ejemplos:
SELECT *
FROM profesores
WHERE población IN (SELECT población
FROM estudiantes
WHERE edad>25);
SELECT *
FROM estudiantes
WHERE edad > ALL (SELECT edad
FROM profesores
WHERE dpto=’Matemáticas’);
Subconsultas de múltiples columnas:
Una subconsulta de múltiples columnas, puede devolver una única o múltiples filas.
Devuelve más de una columna para cada fila. Suele emplearse para validar un conjunto de
columnas con otro en la cláusula WHERE, o como vista en línea en la cláusula FROM.
Ejemplos:
SELECT *
FROM profesores
WHERE (nombre, apellidos) IN (SELECT nombre, apellidos
FROM estudiantes
WHERE edad>25);
SELECT E.nia, nombre, apellidos, media
FROM estudiantes E, (SELECT nia, AVG(nota) MEDIA
FROM suspendidos
GROUP BY nia
HAVING AVG(nota)<3) SUSP3
WHERE E.nia=SUSP3.nia;
CREATE TABLE medias AS (SELECT dni, AVG(notas) media
FROM estudiantes
GROUP BY dni);
Subconsultas correlacionadas:
Las subconsultas correlacionadas permiten la correlación o coincidencia de valores entre las
columnas de la consulta externa y la subconsulta. La consulta externa puede pasar el valor
de una columna a la subconsulta, no siendo posible al revés. Las consultas se van
ejecutando de izquierda a derecha y de arriba abajo. Las subconsultas internas se ejecutan
antes que las invoquen las externas.
Ejemplo:
SELECT nombre
FROM estudiante E
WHERE ‘01/01/02’ > ALL (SELECT fecha_matricula
FROM asigunaturas A
WHERE A.nia=E.nia);
CURSO 2005-06 21
4. S QL SUBCONSULTAS
Subconsultas anidadas:
Una subconsulta anidada es una subconsulta embebida dentro de otra subconsulta.
Ejemplo:
SELECT nombre, apellidos
FROM estudiante E
WHERE nia IN (SELECT nia
FROM matricula
WHERE codasig IN (SELECT codasig
FROM asignaturas
GROUP BY codasig
HAVING COUNT(DISTINCT nia)>100));
Subconsultas vista en línea:
Una subconsultas llamada vista en línea, es una subconsulta embebida en la cláusula FROM
de una instrucción SELECT, como si de una tabla o vista se tratara.
Ejemplos:
SELECT E.nia, nombre, apellidos, Num_asig “Número asignaturas”
FROM estudiante E, (SELECT nia, count(*) Num_asig
FROM matricula
GROUP BY nia
HAVING COUNT(*)>10) AUX
WHERE E.nia=AUX.nia;
UPDATE facturas
SET total=(SELECT importe
FROM (SELECT Fac.codfac codigo, total_fac+total_fac*iva/100-total_fac*dto/100 Importe
FROM facturas Fac, (SELECT F.codfac, SUM(L.subtotal) Total_Fac
FROM facturas F,
(SELECT codfac, (precio*cant)-(precio*cant*dto/100)
Subtotal
FROM lineas_fac) L
WHERE F.codfac=L.codfac
GROUP BY F.codfac) Fac_Tot
WHERE Fac.codfac=Fac_Tot.codfac) AUX
WHERE Aux.codigo=facturas.codfac)
22 CURSO 2005-06