Está en la página 1de 5

UNIVERSIDAD NACIONAL DE INGENIERIA

FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS


Area de Sistemas y Telemática

Profesor: Ing. Javier Sánchez 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 añadir
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 Búsqueda en las Subconsultas

SQL ofrece condiciones de búsqueda dentro de las Clausulas WHERE ó HAVING:

1) Test de comparación subconsulta: Compara el valor de una expresión con un


único valor por una subconsulta.

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


expresión coincide con uno del conjunto de valores producido por una
subconsulta.

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

4) Test de comparación cuantificada: Compara el valor de una expresión con cada


uno del conjunto de valores producido por una subconsulta en dos formas ANY y
ALL.

1
Test de Comparación Subconsulta:

La expresión 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


comparación.

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
WHERE Oficina_rep NOT IN (Select Oficina
FROM OFICINAS
WHERE Dir = 108)

2
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 ó más.

La petición podría ser fácilmente 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 cuestión y b) que tiene
un importe de al menos 25000.

Select DISTINCT Id_fab, id_producto, Descripción 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 condición de búsqueda EXISTS no utiliza realmente los


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

Mostrar las Oficinas en donde haya un vendedor cuya cuota representa más 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: =, <>, >, >=, <, <=

Opción 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.

3
Ejemplo: Mostrar los vendedores que hayan aceptado un pedido que represente
más del 10% de su cuota.
Select Num_empl, Nombre FROM Repventas
WHERE (.1 * Cuota) < Any (Select Importe
FROM PEDIDOS
WHERE Rep = Num_Empl).

Opción All: se utiliza idéntico al ANY con uno de los seis operadores de
comparación 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 versión del motor
de base de datos. Al usarse subconsultas anidadas el nivel de su compresión es
alto.

Ejemplo: Mostrar los clientes cuyos vendedores están asignados a oficinas en la


región 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 también hay casos que
no se pueden expresar equivalentemente.
Ejemplo: Mostrar los nombres y edades de los vendedores que trabajan en oficinas
de la región Oeste

Select nombre, edad from repventas


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

4
Da el mismo resultado en expresar como:

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


And region = “Oeste”

Si se modifica pidiendo además del nombre, edad, la ciudad donde trabajan, la


forma de subconsulta no se puede.

Como también hay muchas consultas con subconsultas que no pueden ser
traducidas a una composición 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 composición.

SUBCONSULTAS CORRELACIONADAS

Una subconsulta que contiene una referencia externa se denomina subconsulta


correlacionada, ya que sus resultados están correlacionados con cada fila individual
de la consulta principal. También 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.

También podría gustarte