Subconsultas SQL 2008
Una subconsulta es una consulta que aparece dentro de otra consulta o subconsultas, en la
lista de selección o en la cláusula WHERE o HAVING, originalmente no se podían incluir en la
lista de selección.
Una subconsulta se denomina también consulta o selección interna, mientras que la
instrucción que contiene la subconsulta es conocida como consulta o selección externa.
Aparecesiempre encerrada entre paréntesis y tiene la misma sintaxis que una sentencia
SELECT normal con alguna limitación:
No puede incluir una cláusula COMPUTE o FOR BROWSE y sólo puede incluir una cláusula
ORDER BY cuando se especifica también una cláusula TOP.
Una subconsulta puede anidarse en la cláusula WHERE o HAVING de una instrucción externa
SELECT, INSERT, UPDATE o DELETE, o bien en otrasubconsulta. Se puede disponer de hasta
32 niveles de anidamiento, aunque el límite varía dependiendo de la memoria disponible y de
la complejidad del resto de las expresiones de la consulta. Hay que tener en cuenta que para
cada fila de la consulta externa, se calcula la subconsulta, si anidamos varias consultas, el
número de veces que se ejecutarán las subconsultas ¡puede dispararse!
Cuandola subconsulta aparece en la lista de selección de otra consulta, deberá devolver un
solo valor, de lo contrario provocará un error.
Ejemplo de subconsulta: Listar los empleados cuya cuota no supere el importe vendido por el
empleado.
SELECT nombre
FROM empleados
WHERE cuota (SELECT SUM(ventas)
FROM empleados
WHERE oficina = oficina);
La columna oficina se encuentra en los dosorígenes (oficinas y empleados) pero esta
consulta no dará error (no se nos pedirá cualificar los nombres como pasaría en una
composición de tablas), dentro de la subconsulta se considera oficina el campo de la
tabla empleados. Con lo que compararía la oficina del empleado con la misma oficina del
empleado y eso no es lo que queremos, queremos comparar la oficina del empleado con
la oficina deoficinas, lo escribiremos pues así para forzar a que busque la columna en la
tabla oficinas.
SELECT oficina, ciudad
FROM oficinas
WHERE objetivo > (SELECT SUM(ventas)
FROM empleados
WHERE oficina = oficinas.oficina);
Ejercicio paso a paso: Subconsultas de resultado único
Objetivo
Realizar consultas que incluyan una subconsulta en la cláusula WHERE. Se realizarán
utilizando operadores decomparación.
Ejercicio paso a paso
Listar todos los productos (código, descripción y stock) del fabricante ACI y cuyas
existencias superan las existencias del producto ACI-41004.
SELECT idfab, idproducto, descripcion, existencias
FROM productos
WHERE idfab = 'ACI'
AND existencias > (SELECT existencias
FROM productos
WHERE idfab = 'ACI' AND idproducto = '41004');
Resultado:
idfabidproducto descripcion existencias
aci 41001
arandela
277
aci
41002
bisagra
167
aci
41003
art 13
207
Listar los empleados (numemp, nombre y edad) que tienen una cuota por encima de la
media.
SELECT numemp, nombre, edad
FROM empleados
WHERE cuota > (SELECT AVG(cuota)
FROM empleados);
Resultado:
numemp
nombre
101
Antonio Viguer
edad
45
102
Alvaro Jaumes48
103
Juan Rovira
29
105
Vicente Pantalla
37
106
Luis Antonio
52
107
Jorge Gutiérrez
49
108
Ana Bustamante
62
114
Pablo Moreno
45
Obtener cuántos empleados tienen una cuota por encima de la media, y la edad media de
estos.
SELECT count(*) AS Cuantos, AVG(edad) AS [Edad Media]
FROM empleados
WHERE cuota > (SELECT AVG(cuota)
FROMempleados);
Resultado:
Cuantos Edad Media
8
45
Listar todas las oficinas cuyos objetivos superan la suma de las cuotas de sus vendedores.
SELECT oficina, ciudad
FROM oficinas
WHERE objetivo > (SELECT SUM(cuota)
oficinas.oficina);
Resultado:
oficina ciudad
11
Valencia
12
Alicante
FROM empleados WHERE oficina =
El operador IN con subconsulta
IN subconsulta
IN examina si...
Regístrate para leer el documento completo.