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)