Está en la página 1de 33

SQL (III PARTE)

SUBCONSULTAS

Prof. Gloria Toro Oñate

Referencia:
‘Database Systems’ Conolly & Begg 4ta
Edición
SUBCONSULTAS

 Algunas clausulas SQL pueden tener un SELECT embebido.

 Una subseleccion puede ser utilizado en las claususlas WHERE


y HAVING de una instruccion SELECT externa, en donde éste
SELECT interno se le llama subconsulta o consulta anidada.
 Las subselecciones pueden también aparecer en instrucciones
INSERT, UPDATE y DELETE.

 ¿Cómo sería la instrucción “eliminar todas propiedades de Quillón que no hayan


sido visitadas durante el mes de mayo”?

2
EJEMPLO 19
UTILIZACIÓN DE UNA SUBCONSULTA CON EL
OPERADOR DE IGUALDAD

Generar un listado con todos los empleados de la sucursal ubicada en ‘Camilo Mori 4’

SELECT nroEmp, nombre, apellido, cargo


FROM Empleado
WHERE idsucursal =
(SELECT idSucursal
FROM Sucursal
WHERE calle= ‘Camilo Mori 4’);
NroStaff Nombre Apellido cargo
La instrucción se convierte en: SG37 Ana Rozas asistente
SG14 David Cabrero supervisor
SELECT nroEmp, nombre, apellido, cargo SG5 Susana Solis administrador
FROM Empleado
3
WHERE idsucursal=‘b003’
EJEMPLO 20 UTILIZACIÓN DE UNA SUBCONSULTA
CON UNA FUNCIÓN DE AGREGACIÓN

Generar un listado de todos los empleados cuyo salario sea superior al salario
medio, indicando cual es la diferencia en cada caso con respecto al salario medio

SELECT nroStaff, nombre, apellido, cargo


salario– (SELECT AVG(salario) FROM Empleado) As DifSalario
FROM Empleado
WHERE salario > ( SELECT AVG(salario)
FROM EMPLEADO);

La consulta externa queda reducida a:

SELECT nroStaff, nombre, apellido, cargo,


salario - 17000 NroStaff Nombre Apellido cargo DifSalario

FROM Empleado SL21 Juan Martinez administrador 13000


WHERE salario>17000; 4
SG14 David Cabrero supervisor 1000
SG5 Susana Solis administrador 7000
REGLAS PARA LAS SUBCONSULTAS

 La clausula ORDER BY no puede ser utilizada en una subconsulta (aunque si puede


emplearse en la instrucción SELECT mas externa).

 La lista SELECT de la subconsulta debe estar compuesta por un único nombre de


columna o expresión, excepto en el caso de las subconsultas que utilizan EXISTS.

 De manera determinada, los nombres de columna de una subconsulta hacen


referencia al nombre de tabla incluido en la clausula FROM de la subconsulta.
Tambien puede hacer referencia a la tabla contenida en el FROM de la consulta
externa utilizando un alias.
 Cuando una subconsulta actúa como uno de los operandos implicados en la
comparación, la subconsulta debe aparecer en el lado derecho de la comparación.

5
EJEMPLO 21 SUBCONSULTAS ANIDADAS:
UTILIZACIÓN DE IN
Generar un listado con los inmuebles gestionados por los empleados que trabajan en
la sucursal situada en ‘Camilo Mori 4’.
SELECT propNo, calle, ciudad, codPostal, tipo, habitaciones, renta
FROM PropiedadRenta
WHERE nroStaff IN
(SELECT nroStaff
FROM EMPLEADO
WHERE idSucursal=
(SELECT idSucursal
FROM Sucursal
WHERE calle= ‘Camilo Mori 4’));

propNo Calle ciudad codPostal tipo habitaciones renta


PG16 San Isidro 34 Concepción C158 departamento 4 450 6
PG36 Calle Principal 2 Concepción C898 departamento 3 375
PG21 Ramuntcho 66 Concepción C658 casa 5 600
ANY Y ALL

 ANY y ALL pueden utilizarse con aquellas subconsultas que


generan una única columna de números.
 Con ALL, la condición sólo será cierta si se ve satisfecha por
todos los valores generados por la subconsulta.
 Con ANY, la condicion sólo será cierta si se ve satisfecha por
alguno de los valores producidos por la subconsulta.
 Si la consulta está vacía, ALL retorna verdadero, ANY retorna
falso.
 SOME también puede ser utilizado en lugar de ANY.

7
EJEMPLO 22
UTILIZACIÓN DE ANY/SOME

Determinar todos los empleados cuyo salario sea superior al


salario de al menos uno de los empleados de la sucursal B003.

SELECT nroStaff, nombre, apellido, cargo, salario


FROM Empleado
WHERE salario> SOME
(SELECT salario
FROM Empleado
WHERE nroSucursal= ‘B003’);

8
EJEMPLO 22
UTILIZACIÓN DE ANY/SOME

 La consulta interna produce el conjunto {12000, 18000, 24000} y la


consulta externa selecciona aquellos empleados cuyos salarios son
mayores que cualquiera de esos valores en el conjunto.

NroStaff Nombre Apellido cargo salario


SL21 Juan Martinez administrador 30000
SG5 Susana Solis supervisor 24000
SG14 David Cabrero administrador 18000
9
EJEMPLO 23
UTILIZACIÓN DE ALL
Determinar todos los empleados cuyo salario sea superior al salario
de todos los empleados que trabajan en la sucursal B003.

SELECT nroStaff, nombre, apellido, cargo, salario


FROM Empleado
WHERE salario > ALL
(SELECT salario
FROM Empleado
WHERE nroSucursal= ‘B003’);

NroStaff Nombre Apellido cargo salario


10
SL21 Juan Martinez administrador 30000
CONSULTAS MULTI-TABLAS

 Se pueden utilizar subconsultas siempre que las columnas


provengan de la misma tabla

 Si los resultados vienen de más de una columna debe utilizar JOIN.

 Para llevar a cabo el JOIN, deben incluirse más de una tabla en la


cláusula FROM.

 Se utiliza ‘,’ como separador, y se suele incluir en la cláusula


WHERE la especificación de la columna que genera el JOIN

11
CONSULTAS MULTI-TABLAS

 También es posible utilizar un alias para una tabla


en la cláusula FROM.

 El alias va separado del nombre de la tabla por un


espacio.

 El alias se puede utilizar para calificar los nombres


de la columna cuando hay ambiguedad.

12
EJEMPLO 24
COMBINACIÓN SIMPLE

Generar un listado con los nombres de todos los clientes que hayan
visitado un inmueble, incluyendo en él los comentarios realizados

SELECT c.nroCliente,nombre, apellido,


propNo, comentario
FROM cliente c, Visitav
WHERE c.nroCliente = v.nroCliente;

13
EJEMPLO 24
COMBINACIÓN SIMPLE

 Sólo aquellas filas de ambas tablas que tienen valores idénticos


en la columna clientNo (c.nroCliente = v.nroCliente) son
incluidas en el resultado. Decimos que estas columnas son
correspondientes.

nroCliente nombre apellido propNo comentario


CR56 Alicia Sepúlveda PG36
CR56 Alicia Sepúlveda PA14 demasiado lejos
CR56 Alicia Sepúlveda PG4
CR62 María Torres PA14 no tiene sala de estar
no hay locomoción 14
CR76 Juan Carrasco PG4 cerca
CONSTRUCTORES ALTERNATIVOS
PARA JOIN

 SQL proporciona las siguientes formas alternativas de especificar


estas combinaciones:

FROM Cliente c JOIN Visita v ON c.nroCliente = v.nroCliente


FROM Cliente JOIN Visita USING nroCliente
FROM Cliente NATURAL JOIN nroCliente

 En cada uno de los casos, la clausula FROM sustituye a las


clausulas FROM y WHERE originales. Sin embargo, el primero,
produce una tabla con dos columnas clientNo identicas.

15
EJEMPLO 25
ORDENACIÓN DE UNA COMBINACIÓN
Para cada sucursal, indicar los números y los nombres de los empleados
que gestionan inmuebles, así como los inmuebles que gestionan.

SELECT s.idSucursal, s.nroStaff, nombre, apellido, propNo


FROM Empleado s, PropiedadRenta p
WHERE s.nroStaff = p.nroStaff
ORDER BY s.idSucursal, s.nroStaff, propNo;

Idsucursal NroStaff Nombre Apellido propNo


b003 SG14 David Cabrero PG16
b003 SG37 Ana Rozas PG21
b003 SG37 Ana Rozas PG36
16
b005 SL41 Julia Ocampo PL94
b007 SA9 María Ramirez PA14
EJEMPLO 26
COMBINACIÓN DE TRES TABLAS

Para cada sucursal, indicar los números y los nombres de los empleados que
gestionan inmuebles, incluyendo la ciudad en la que está ubicada la sucursal
y los inmuebles que el empleado gestiona.

SELECT b.idSucursal, b.ciudad, s.nroStaff, nombre, apellido, propNo


FROM Sucursal b, empleado s, propiedadRenta p
WHERE b.idSucursal = s.idSucursal AND
s.propNo = p.propNo
ORDER BY b.idSucursal, s.nroStaff, propNo

Idsucursal ciudad NroStaff Nombre Apellido propNo


b003 Concepción SG14 David Cabrero PG16
b003 Concepción SG37 Ana Rozas PG21 Formulación alternativa FROM y WHERE:
b003 Concepción SG37 Ana Rozas PG36 17
FROM (Sucursal b JOIN Empleado s USING
b005 Temuco SL41 Julia Ocampo PL94 idSucursal) AS bs
JOIN propiedadRenta p USING nroStaff
b007 Temuco SA9 María Ramirez PA14
EJEMPLO 27
MÚLTIPLES COLUMNAS DE AGRUPAMIENTO
Determinar el número de inmuebles gestionados por cada empleado

SELECT s.idSucursal, s.nroStaff, COUNT(*) AS cuenta


FROM Empleado s, propiedadRenta p
WHERE s.nroStaff = p.nroStaff
GROUP BY s.idSucursal, s.nroStaff
ORDER BY s.idSucursal, s.nroStaff;

Idsucursal NroStaff cuenta


b003 SG14 1
b003 SG37 2
b005 SL41 1 18
b007 SA9 1
CÁLCULO DE UNA COMBINACIÓN

1. Formar el producto cartesiano de las tablas especificadas en la clausula FROM


2. Si hay una clausula WHERE, aplicar la condición de busqueda a cada fila de la
tabla producto, resumiendo unicamente aquellas filas que satisfagan la
condición.
3. Para cada una de las filas restantes, determinar el valor de cada elemento de la
lista SELECT para generar una fila de la tabla de resultados.
4. Si se ha especificado un DISTINCT, eliminar cualesquiera filas duplicadas de
la tabla de resultado.
5. Si hay una clausula ORDER BY, ordenar la tabla de resultados según se
requiera.

 SQL proporciona una forma especial de la instrucción SELECT para calcular el


producto cartesiano:
SELECT [DISTINCT | ALL] {* | columnList}
FROM Table1 CROSS JOIN Table2
19
COMBINACIONES EXTERNAS

 Si una fila de una tabla no tiene ninguna correspondencia en la


otra, se omite dicha fila de la tabla de resultados.
 La combinación externa retiene aquellas filas que no satisfagan
la condición de combinación.
 Considere las siguientes tablas:

Sucursal PropiedadRenta
idSucursal ciudad propNo ciudad
b005 Concepcion PA14 Quillón
b003 Temuco PL94 Talca
b004 Talca PG4 Temuco
20
OUTER JOINS
Sucursal PropiedadRenta
idSucursal Ciudad_S propNo Ciudad_P
b005 Concepción PA14 Quillón
b003 Temuco PL94 Talca
b004 Talca PG4 Temuco

 El (inner) join de estas dos tablas:


SELECT b.*, p.*
FROM Sucursal b, PropiedadRenta p
WHERE b.ciudad_S = p.ciudad_P;

idSucursal ciudad_S propNo ciudad_P


b003 Temuco PG4 Temuco
b004 Talca PL94 Talca 21
EJEMPLO 28 LEFT OUTER JOIN
Sucursal PropiedadRenta
idSucursal Ciudad_S propNo Ciudad_P
b005 Concepción PA14 Quillón
b003 Temuco PL94 Talca
b004 Talca PG4 Temuco

Generar un listado con todas las sucursales y los inmuebles que estén en
la misma ciudad que alguna sucursal

SELECT b.*, p.*


FROM Sucursal b LEFT PropiedadRenta p
ON b.ciudad_S = p.ciudad_P;

idSucursal ciudad_S propNo ciudad_P


b005 Concepción null null
b003 Temuco PG4 Temuco 22

b004 Talca PL94 Talca


EJEMPLO 29 RIGHT OUTER JOIN
Sucursal PropiedadRenta
idSucursal Ciudad_S propNo Ciudad_P
b005 Concepción PA14 Quillón
b003 Temuco PL94 Talca
b004 Talca PG4 Temuco

Generar un listado con todos los inmuebles y de las sucursales que estan
en la misma ciudad

SELECT b.*, p.*


FROM Sucursal b RIGHT PropiedadRenta p
ON b.ciudad_S = p.ciudad_P;

idSucursal ciudad_S propNo ciudad_P


b003 Temuco PG4 Temuco
b004 Talca PL94 Talca 23
null null PA14 Quillón
EJEMPLO 30 FULL OUTER JOIN
Sucursal PropiedadRenta
idSucursal Ciudad_S propNo Ciudad_P
b005 Concepción PA14 Quillón
b003 Temuco PL94 Talca
b004 Talca PG4 Temuco

Generar un listado con las sucursales e inmuebles que estén en la misma


ciudad, incluyendo en el listado, las sucursales o inmuebles que no
tengan valor correspondiente

SELECT b.*, p.*


FROM Sucursal b FULL PropiedadRenta p
ON b.ciudad_S = p.ciudad_P;
idSucursal ciudad_S propNo ciudad_P
b005 Concepción null null
b003 Temuco PG4 Temuco 24
b004 Talca PL94 Talca
null null PA14 Quillón
EXISTS Y NOT EXISTS

 EXISTS y NOT EXISTS son utilizados sólo para subconsultas.


 Producen un resultado true/false.
 TRUE si y solo si existe una fila en la tabla de resultados
devuelta por la consulta.
 FALSE si la subconsulta devuelve una tabla de resultados
vacía.
 NOT EXISTS es la condición opuesta de EXISTS.
 Puesto que (NOT) EXISTS sólo comprueba la existencia o no
existencia de las filas en la tabla de resultados, la subconsulta
puede tener cualquier número de columnas.
 Por lo general tienen la forma:

(SELECT * FROM …)
25
EJEMPLO 31
CONSULTA UTILIZANDO EXISTS
Extraer todos los empleados que trabajan en una sucursal de Concepción

SELECT nroStaff, nombre, apellido, cargo


FROM Staff s
WHERE EXISTS
(SELECT *
FROM Sucursal b
WHERE s.idSucursal = b.idSucursal AND ciudad = ‘Concepción’);

NroStaff Nombre Apellido cargo

SL21 Juan Martinez administrador

SL41 Julia Ocampo asistente


26
UNION, INTERSECT, Y EXCEPT

 Se puede utilizar las operaciones normales de conjunto union,


intersección y diferencia para combinar los resultados de dos o mas
consultas en una única tabla de resultados.

 La UNION de dos tablas, A y B, es una tabla que contiene todas las


filas de A o B o ambas

 La INTERSECCION de dos tablas, A y B, es una tabla que contiene


todas las filas que son comunes tanto para A como para B.

 La DIFERENCIA de dos tablas, A y B, es una tabla que contiene


todas las filas ques están contenidas en A pero no en B.

 Las dos tablas deben ser compatibles con respecto a la unión.


27
UNION, INTERSECT, AND DIFFERENCE
(EXCEPT)

 El formato para todos los casos es:


operador [ALL] [CORRESPONDING [BY {column1 [, ...]}]]

 Si se especifica CORRESPONDING BY, la operación de conjuntos


se realizará sobre las columnas designadas(s).
 Si se especifica CORRESPONDING pero no BY, la operación de
conjuntos se realiza sobre todas las columnas que sean comunes a
ambas tablas.
 Si se especifica ALL, el resultado puede incluir filas duplicadas.

28
UNION, INTERSECT, Y DIFFERENCE
(EXCEPT)

29
EJEMPLO 32 UTILIZACIÓN DE UNION
Construir una lista con todas las ciudades en la que exista una
sucursal o inmueble.

(SELECT ciudad
FROM Sucursal
WHERE ciudad IS NOT NULL)
UNION ciudad
(SELECT ciudad Concepcion
FROM PropiedadRenta Temuco
WHERE ciudad IS NOT NULL); Talca
 O Quillón
(SELECT *
FROM sucursal
WHERE ciudad IS NOT NULL)
UNION CORRESPONDING BY ciudad
(SELECT *
FROM propiedadRenta 30
WHERE ciudadIS NOT NULL);
EJEMPLO 33 UTILIZACIÓN DE INTERSECT
Construir una lista de todas las ciudades en las que haya tanto
una sucursal como un inmueble.

(SELECT ciudad FROM Sucursal)


INTERSECT
(SELECT ciudad FROM PropiedadRenta);
O
(SELECT * FROM Sucursal) ciudad
INTERSECT CORRESPONDING BY ciudad Temuco
(SELECT * FROM PropiedadRenta);
Talca

31
EJEMPLO 34 UTILIZACIÓN DE EXCEPT
Construir una lista con todas las ciudades en las que haya una
sucursal pero no haya ningún inmueble.

(SELECT ciudad FROM Sucursal)


EXCEPT
(SELECT ciudad FROM PropiedadRenta);
 O
(SELECT * FROM Sucursal)
EXCEPT CORRESPONDING BY ciudad
(SELECT * FROM PropiedadRenta);

ciudad
Concepción 32
 Ejercicios Guías en PVA
 Ejercicios sobre modelos propios

33

También podría gustarte