Consultas Anidadas

Anuncio
Consultas anidadas
Consultas anidadas
Consultas Anidadas
Son bloques completos de SELECT,
FROM, WHERE, …, dentro de la clasula
WHERE de otra consulta.
• Definición consulta y uso del renombre
• Operadores de comparaciones:
Esta otra consulta se denomina consulta
externa.
– IN, ANY, ALL, SOME
– EXIST, NOT EXIST
– UNIQUES
Consultas anidadas: Renombre
Operador de comparación: IN
Para evitar la ambigüedad, renombrar: AS
IN compara el valor v con un conjunto o
TablaUno (A, B, C, D)
TablaDos (E, F, A)
En la consulta
interna se pueden
utilizar atributos de
la externa
multiconj. de valores V y evalúa a TRUE para
comparar si v es uno de los elementos de V
select A, B
from TablaUno
where C in (select E
from TablaDos
where F < A)
select A, B
AS Z
from TablaUno
where C in (select E
from TablaDos
Atributo de
TablaDos
where F <
Atributo de
TablaUno
La consulta interna se evaluará una vez por
TablaUno
Operador IN: Proceso
TablaUno
select A, B, C
from TablaUno AS Z
where A in
(select A
from TablaDos
where F<6 and E=Z.D)
TablaDos
A
B
C
D
1
2
bb
ab
5
3
aba
aaa
3
4
cb
ec
4
2
bbe
aeb
A
1
B
bb
C D Realizar la selección Realizar la proyección
de la subconsulta
5 aba en la subconsulta
2
3
ab
cb
3
4
aaa
bbe
4
ec
2
aeb
DBD 2006 - 2007
? Null
? s
?
? p
? t1 in is
TRUE?
Comprobar la
condición de la
consulta externa
cada tupla de la consulta externa
Z.A)
A
1
B
bb
C
5
D
aba
ab
cb
ec
3
4
2
aaa
bbe
aeb
G
1
E
aaa
F
2
A
2
2
3
4
2
3
aeb
aeb
3
8
4
2
A
B
C
D
4
5
aeb
aba
5
8
3
1
1
2
bb
ab
5
3
aba
aaa
3
4
cb
ec
4
2
bbe
aeb
A
B
C
D
1
2
bb
ab
5
3
aba
aaa
3
4
cb
ec
4
2
bbe
aeb
?
Preparar las tuplas
del resultado
...
G
E
1
F
A
aaa 2
2
?
s
?
A
2
?
?
G
B
ab
?
?
s
E
2 aeb
4 aeb
?
s
s
? A
p 2
TablaDos
t2 in ?
C
3
? t3
F<6 and E=Z.D
G
E
F
A
1
2
aaa
aeb
2
3
2
4
3
4
aeb
aeb
8
5
2
3
5
aba
8
1
in ?
p
F
A
3
5
4
3
?
p
A
4
A
2
B
ab
C
3
4
ec
2
3
t4 in ?
RESULTADO
Consultas anidadas
Operador IN
Ej. Operador In
Se evalúa a true, si el valor del atributo está en el conjunto de
la subconsulta
WHERE <atributo> IN <subconsulta>
Se pueden incluir tuplas de atributos, pero los atributos de
ambas partes deben ser compatibles para la unión
El mismo número de atributos
? WHERE (a, b) IN (SELECT d FROM ...
El mismo dominio
int char
int int
int char
char int
? WHERE (a, b) IN (SELECT c, d FROM ...
En el mismo orden
? WHERE (a, b) IN (SELECT c, d FROM ...
Dtor. de sucursal situada en Bilbao, Madrid o Barcelona
SELECT director
FROM Sucursal
WHERE ciudad IN (Bilbao, Madrid, Barcelona)
Dtor. de sucursal situada donde exista alguna sucusal
del banco BBV
SELECT director
FROM Sucursal
WHERE ciudad IN
(SELECT ciudad
FROM Sucursal
WHERE pertenecienteA = ‘BBV’)
Operadores Any / All
ANY / ALL
< ANY (SOME)
= ANY o = SOME devuelve TRUE si el
valor v es igual a algún valor del conjunto
V y por lo tanto equivale al IN.
True, si el valor del atributo es menor que alguno de
los valores de la subconsulta
=, >, <=, >=, < >
WHERE <atributo> < ANY <subconsulta>
( v > ALL V ) devuelve TRUE si el valor v
es mayor que todos los valores del
conjunto V.
< ALL
True, si el valor del atributo es menor que todos los
valores de la subconsulta
>, <=, >=, < >
WHERE <atributo> < ALL <subconsulta>
Comparación ALL – ANY
Empleado(dni, ..., sueldo)
DNI
1
...
Sueldo
100
2
3
150
175
4
5
200
160
select dni
from Empleado
where sueldo xxxx
(select sueldo
from Empleado)
RESULTADO
xxxx:
xxxx
: < ALL
<= ALL
< ANY
<= ANY
DBD 2006 - 2007
?
?
?
?
Ej. All y SOME
Sucursales con un activo mayor que cualquier de las sucursal
del BBV
?
1
1, 2, 3, 5
1, 2, 3, 4, 5
SELECT nombre
FROM Sucursal
WHERE activo > ALL (SELECT activo
FROM Sucursal
WHERE perteneceA = ‘BBV’)
Sucursales con un activo mayor que alguna de las sucursales del
BBV
SELECT nombre
FROM Sucursal
WHERE activo > SOME
(SELECT activo
FROM Sucursal
WHERE perteneceA = ‘BBV’)
Consultas anidadas
Operador Exists
EXISTS
Se evalúa a true, si la subconsulta devuelve alguna
tupla
Comprueba si el resultado de la consulta
anidada es o no vacía (contiene o no
tuplas)
WHERE EXISTS <galdera>
True, si en la subconsulta no hay ninguna tupla
WHERE NOT EXISTS <galdera>
En algunos casos es equivalente al predicado IN
Devuelve TRUE si existe por lo menos
una tupla que cumpla la condición.
select A, B, C
from TablaUno AS Z
where exists(select *
from TablaDos
where A=Z.A)
select A, B, C
from TablaUno
where A in(select A
from TaulaDos)
TablaUno(A, B, C, D)
TablaDos(E, F, A)
Alumno
dni nombre
1
Jon
2
Ane
3
Leire
select nombre
from Alumno as A
where exists
(select *
from Calificaciones
where nota>=7 and dni = A.dni)
dni nombre
Calificaciones
dni
cod
nota
1
7984
5
1
7450
4,5
1
7540
8,5
1
Jon
2
Ane
3
Leire
dni nombre
1
Jon
2
7984
6
2
4544
3
2
Ane
3
7984
7,5
3
Leire
3
4544
9
3
7540
8
dni nombre
Realizar selección
en la subconsulta
dni
cod
1
not
a
Ej. Exists
Sucursales de Eibar con un activo mayor que alguna de las
sucursales del BBV
Preparar las tuplas
del resultado
nombre
Jon
7540 8,5
?
nombre
? ?
Jon
?
dni
cod
not
a
1
Jon
3
7984 7,5
2
Ane
3
4544
9
3
Leire
3
7540
8
Obtener Suc1? Sucursal t.q Suc1.ciudad = “Eibar”
AND (? Suc2? Sucursal (Suc1.activo > Suc2.activo))
nombre
Jon
Leire
SELECT nombre
FROM Sucursal AS Suc1
WHERE ciudad = “Eibar”
AND EXISTS
(SELECT *
FROM Sucursal AS Suc2
WHERE perteneceA = ‘BBV’
AND Suc1.activo > Suc2.activo)
RESULTADO
Unique
Ej. Not Exist
Obtener el nombre de los alumnos que están matriculados
de TODAS las asignaturas del departamento de LSI
SELECT nombre
FROM Alumno AS a
WHERE NOT EXISTS (SELECT *
FROM Asignatura AS b
WHERE suDepartamento = “LSI”
AND NOT EXISTS
(SELECT *
FROM Matricula AS m
WHERE m.elAlumno = a.nombre
? x P(x) ? ? ? x ? P(x) AND m.laAsignatura = b.codigo))
A? B ? ? A? B
? (A ? B) ? ? A ? ? B
DBD 2006 - 2007
Se evalúa a true, si en el resultado de la
subconsulta no hay tuplas repetidas
WHERE UNIQUE <subconsulta>
TablaUno
•A •B •C •D
•1 •bb •5 •aba
•2 •ab •3 •aaa
•3 •cb •4 •bbe
•4 •ec •2 •aeb
G
1
TablaDos
E
F
aaa 2
A
2
2
3
aeb
aeb
3
4
4
2
4
5
aeb
aba
6
4
3
1
6
aaa
2
2
A
1
B
bb
C
5
2
3
ab
cb
3
4
RESULTADO
select A, B, C
from TablaUno as Z
where unique(select E from TablaDos where F=Z.C)
Descargar