Sei sulla pagina 1di 5

UNIVERSIDAD NACIONAL DE INGENIERIA

FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS


Area de Sistemas y Telemtica

Profesor: Ing. Javier Snchez Espinoza

SUBCONSULTAS

Permite utilizar los resultados de una consulta como parte de otra.


Una Subconsulta es una consulta que aparece dentro de la clausula WHERE
HAVING de otra sentencia SQL.

Ejemplo: Mostrar las Oficinas donde el objetivo de ventas de la Oficina exceden


a la suma de las cuotas de los vendedores individuales.

Select Oficina, Ciudad FROM OFICINAS


WHERE Objetivo > (Select Sum (Cuota)
FROM Repventas
WHERE Oficina_rep = Oficina)

Para cada oficina, la consulta interna (Subconsulta) calcula la suma de las cuotas
para los vendedores que trabajan en esa oficina. La consulta externa (consulta
principal) Compara el objetivo de la Oficina con el total calculado y decide si
aadir la oficina a los resultados de la consulta principal.

Referencia Externa: es utilizar una columna en la subconsulta (Ejemplo: la


columna Oficina) que pertenezca a la tabla de la consulta principal.

Condiciones de Bsqueda en las Subconsultas

SQL ofrece condiciones de bsqueda dentro de las Clausulas WHERE HAVING:

1) Test de comparacin subconsulta: Compara el valor de una expresin con un


nico valor por una subconsulta.

2) Test de pertenencia a conjunto subconsulta: Comprueba si el valor de una


expresin coincide con uno del conjunto de valores producido por una
subconsulta.

3) Test de existencia: Examina si una subconsulta produce alguna fila de


resultados.

1
4) Test de comparacin cuantificada: Compara el valor de una expresin con cada
uno del conjunto de valores producido por una subconsulta en dos formas ANY
y ALL.

Test de Comparacin Subconsulta:

La expresin de la consulta principal se relaciona con los operadores =, <>, >=,


<=, >,< con la subconsulta.

Ejemplo adicional: Listar todos los clientes atendidos por Bill Adams

Select Num_clie, Empresa FROM CLIENTES


WHERE Rep_clie = (Select Num_empl FROM
REPVENTAS
WHERE nombre = Bill Adams)

Siempre la subconsulta debe de estar en el lado derecho de operador de


comparacin.

Test de pertenencia a conjuntos (IN):

Compara un nico valor de datos con una columna de valores producida por una
subconsulta y devuelve el resultado TRUE si el valor coincide con uno de los
valores de la columna.

Este test se utiliza cuando se necesita comparar un valor de la fila que est siendo
examinada con un conjunto de valores producidos por una subconsulta.

Formato:

expresion_de_test NOT IN Subconsulta

Ejemplo: Mostrar los vendedores que trabajan en Oficinas que superen su objetivo

Select Num_empl, Nombre FROM REPVENTAS


WHERE Oficina_rep IN (Select Oficina
FROM OFICINAS
WHERE Ventas > objetivo)

Mostrar los vendedores que no trabajan en oficinas dirigidas por Larry Fitch
(empleado 108)
Select Num_empl, Nombre FROM REPVENTAS

2
WHERE Oficina_rep NOT IN (Select Oficina
FROM OFICINAS
WHERE Dir = 108)

Test de Existencia (EXISTS):

Comprueba si una subconsulta produce alguna fila de resultados.

Formato: NOT EXISTS Subconsulta


Ejemplo: Mostrar los productos para los cuales se ha recibido un pedido de
25000 ms.

La peticin podra ser fcilmente expresada de esta forma:

Mostrar los productos para los cuales existe al menos un pedido en la


tabla PEDIDOS a) que se refiera al producto en cuestin y b) que tiene
un importe de al menos 25000.

Select DISTINCT Id_fab, id_producto, Descripcin FROM PRODUCTOS


WHERE EXISTS (Select Num_pedido FROM PEDIDOS
WHERE Producto = Id_producto
AND Fab = Id_Fab
AND Importe > = 25000)

Se puede observar que la condicin de bsqueda EXISTS no utiliza realmente los


resultados de la subconsulta, simplemente comprueba si la subconsulta produce
algn resultado. Entonces se puede utilizar Select * en la Subconsulta.

Mostrar las Oficinas en donde haya un vendedor cuya cuota representa ms del
55% del objetivo de la oficina:
Select Ciudad FROM OFICINAS
WHERE EXISTS (Select * FROM Repventas
WHERE Oficina_rep = Oficina
AND Cuota > (.55 * Objetivo))

Test Cuantificados ANY y ALL:

Compara un valor de dato con la columna de valores producidos por una


subconsulta.

Expresion_de_test Operador ANY Subconsulta


ALL
Donde operador: =, <>, >, >=, <, <=

3
Opcin ANY: con el operador se compara un nico valor de test con una columna
de valores producidos por una subconsulta, uno cada vez. Si alguna de las
comparaciones individuales produce un resultado TRUE, el test ANY devuelve el
resultado TRUE.
Ejemplo: Mostrar los vendedores que hayan aceptado un pedido que represente
ms del 10% de su cuota.
Select Num_empl, Nombre FROM Repventas
WHERE (.1 * Cuota) < Any (Select Importe
FROM PEDIDOS
WHERE Rep = Num_Empl).

Opcin All: se utiliza idntico al ANY con uno de los seis operadores de
comparacin SQL, para comparar un nico valor de test con una columna de
valores de datos producidos por una subconsultas. Si todas las comparaciones
individuales producen un resultado TRUE, el test ALL devuelve un resultado
TRUE.

Ejemplo: Mostrar las Oficinas y sus objetivos en donde todos los vendedores
tienen ventas que superan al 50% del objetivo de la Oficina.

Select Oficina, Ciudad, Objetivo FROM OFICINAS


WHERE (.50 * Objetivo) < ALL (Select Ventas
FROM RepVentas
WHERE Oficina_rep = Oficina)

ANIDAMIENTO DE SUBCONSULTAS

Se pueden anidar varias subconsultas, los niveles depende de la versin del


motor de base de datos. Al usarse subconsultas anidadas el nivel de su
compresin es alto.

Ejemplo: Mostrar los clientes cuyos vendedores estn asignados a oficinas en la


regin de ventas Este

Select Num_clie, Empresa from Clientes


Where rep_clie in (Select num_empl from Repventas
Where Oficina_rep in (Select Oficina from Oficinas
Where Region = Este))

SUBCONSULTAS Y COMPOSICIONES
Es dependiente del problema que las consultas con subconsultas se pueden
expresar en forma equivalente a consulta multitabla, como tambin hay casos que
no se pueden expresar equivalentemente.

4
Ejemplo: Mostrar los nombres y edades de los vendedores que trabajan en
oficinas de la regin Oeste

Select nombre, edad from repventas


Where oficina_rep in (select oficina from oficinas where region = Oeste

Da el mismo resultado en expresar como:

Select nombre, edad from repventas, oficinas where oficina_rep = oficina


And region = Oeste

Si se modifica pidiendo adems del nombre, edad, la ciudad donde trabajan, la


forma de subconsulta no se puede.

Como tambin hay muchas consultas con subconsultas que no pueden ser
traducidas a una composicin equivalente, como:

Mostrar los nombres y edades de los vendedores que tienen cuotas por encima
del promedio.

Select nombre, edad from repventas


Where cuota > (select avg(cuota) from repventas)

No tiene equivalente en composicin.

SUBCONSULTAS CORRELACIONADAS

Una subconsulta que contiene una referencia externa se denomina subconsulta


correlacionada, ya que sus resultados estn correlacionados con cada fila
individual de la consulta principal. Tambin a la referencia externa se le denomina
referencia correlacionada.

Ejemplo: Mostrar las oficinas cuyos objetivos exceden a la suma de las cuotas de
los vendedores que trabajan en ellas.

Select ciudad from oficinas


Where objetivo > (select sum(cuota) from repventas
Where oficina_rep = oficina)

Nota: Esta separata ha sido elaborada con la referencia del libro Aplique SQL de James R. Groff y Paul N.
Weinberg.

Potrebbero piacerti anche