La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Consultas anidadas.

Presentaciones similares


Presentación del tema: "Consultas anidadas."— Transcripción de la presentación:

1 Consultas anidadas

2 2.4 Manipulación de datos: SQL-92
Consultas anidadas Es una consulta SELECT completa, dentro de cláusula WHERE de otra consulta (consulta exterior) Obtiene valores de la BD que se usan en la condición de otra consulta, para obtener otros datos * Números de los proyectos en que participa el empleado de apellido ‘Silva’, sea como trabajador o como gerente del departamento que controla el proyecto SELECT DISTINCT numerop FROM PROYECTO WHERE numerop IN ( SELECT nump FROM Trabaja_en, Empleado WHERE nsse=nss AND apellido=‘Silva’ ) OR numerop IN ( SELECT numerop FROM Proyecto, Departamento, Empleado WHERE numd=númerod AND nssdire=nss AND apellido=‘Silva’ ) ; Es posible tener varios niveles de consultas anidadas Tema 2. Modelo relacional de datos

3 2.4 Manipulación de datos: SQL-92
Consultas anidadas (2): comparar conjuntos Operador IN (otro uso del mismo operador) t IN S indica si la fila t pertenece al conjunto de filas S (subconsulta) * Nombre y dirección de los empleados que trabajan en algún proyecto. SELECT nombre, dirección FROM Empleado WHERE nss IN ( SELECT nsse FROM TRABAJA_EN ); * Números de seguridad social de aquellos empleados que trabajan en algún proyecto en el que trabaje el empleado ‘José B. Silva’, de forma que ambos tengan la misma combinación (proyecto, horas); es decir, todo empleado que trabaje las mismas horas que ‘José B. Silva’, en cada proyecto en el que trabajen ambos. El nss de ‘José B. Silva’ es ‘ ’. SELECT DISTINCT nsse FROM Trabaja_en WHERE (númp, horas) IN ( SELECT númp, horas FROM Trabaja_en WHERE nsse=‘ ’); Tema 2. Modelo relacional de datos

4 ¿”Mejor” con DISTINCT en la subconsulta?
2.4 Manipulación de datos: SQL-92 Consultas anidadas (3): comparar conjuntos Operador ANY o SOME (otro uso del mismo operador) t <op> ANY S o t <op> SOME S,, <op>  { , , , , ,  } Compara una fila t con las filas resultado de una consulta anidada S Devuelve TRUE si alguna fila e de S cumple que t <op> e Operador ALL (otro uso del mismo operador) t <op> ALL S,, <op>  { , , , , ,  } Compara una fila t con filas resultado de una consulta anidada S Devuelve TRUE si para toda fila e de S se cumple que t <op> e * Nombres y apellidos de los empleados cuyo salario es menor que el de todos los empleados del departamento 5 SELECT nombre, apellido FROM Empleado WHERE salario < ALL ( SELECT salario FROM Empleado WHERE nd=5 ); El DISTINCT en la subconsulta reduciría el número de filas resultado de la misma, por lo que compararía menos veces el valor de salario. Sin embargo DISTINCT es costoso de ejecutar. ¿”Mejor” con DISTINCT en la subconsulta? Tema 2. Modelo relacional de datos

5 2.4 Manipulación de datos: SQL-92
Consultas anidadas (4): columnas ambiguas Coincidencia de nombres de columnas en las consultas exterior y anidada  Ambigüedad * Nombre y apellidos de cada empleado con familiares de igual nombre y sexo que él SELECT nombre, apellido FROM Empleado WHERE nss IN ( SELECT nsse FROM Familiar WHERE nsse=nss AND nombre_familiar=nombre AND sexo=sexo );  ¿cómo evitar esta ambigüedad? Regla: Una columna no calificada se refiere a la tabla declarada en la consulta anidada más interior Si en una consulta anidada es necesario usar columnas de tablas declaradas en una consulta exterior  calificar SELECT nombre, apellido FROM Empleado E WHERE nss=nsse AND nombre_familiar=nombre AND sexo= E.sexo ); Tema 2. Modelo relacional de datos

6 2.4 Manipulación de datos: SQL-92
Consultas anidadas (5): correlación Una consulta exterior y otra anidada están correlacionadas si una condición de la anidada contiene columnas de una tabla declarada en la consulta exterior SELECT nombre, apellido FROM Empleado WHERE nss IN ( SELECT nsse FROM Familiar WHERE nss=nsse AND sexo=‘F’ ); La consulta anidada se evalúa una vez para cada fila (o combinación de filas) de la consulta exterior Evalúa la consulta anidada para cada fila de EMPLEADO, Si el valor de nss de la fila EMPLEADO está en el resultado de la consulta anidada, selecciona la fila EMPLEADO para el resultado final Una consulta anidada que use el operador = o IN siempre puede expresarse como una reunión (join) SELECT E.nombre, E.apellido FROM Empleado, Familiar D WHERE nss=nsse AND D.sexo=‘F’; Tema 2. Modelo relacional de datos

7 2.4 Manipulación de datos: SQL-92
Consultas anidadas (6): EXISTS Operador EXISTS (S): comprobación de tablas vacías Devuelve TRUE si la tabla S contiene al menos una fila Devuelve FALSE si S es una tabla vacía (sin filas) S suele ser una consulta anidada correlacionada * Nombre y apellido de cada empleado con familiares de igual nombre y sexo que él SELECT E.nombre, E.apellido FROM Empleado E WHERE EXISTS ( SELECT * FROM Familiar WHERE nsse=nss AND nombre_familiar=nombre AND sexo=E.sexo ); * Nombres de empleados sin familiares SELECT nombre, apellido FROM Empleado E WHERE NOT EXISTS (SELECT * FROM Familiar WHERE nsse=nss); EXISTS suele implicar una consulta anidada correlacionada que PUEDE EVITARSE utilizando el operador IN. La consulta resulta así más eficiente, por no contener una correlación. Tema 2. Modelo relacional de datos

8 2.4 Manipulación de datos: SQL-92
Consultas anidadas (y 7): UNIQUE Operador UNIQUE (S): Comprobación de filas duplicadas Devuelve TRUE si NO hay filas repetidas en S S suele ser una consulta anidada correlacionada * Nombres y apellidos de los empleados que trabajan en un único proyecto SELECT nombre, apellido FROM Empleado WHERE UNIQUE ( SELECT nsse FROM Trabaja_en WHERE nsse = nss ); * Nombres, apellidos y salario de los empleados con un solo familiar SELECT nombre, apellido, salario FROM Empleado WHERE UNIQUE ( SELECT * FROM Familiar WHERE nsse = nss ); Oracle no implementa el operador UNIQUE. *************************************************** Un aspecto interesante que incorpora ORACLE y del cual no se menciona nada en el estándar es el siguiente: VISTAS EN LÍNEA Una vista en línea es una subconsulta (un SELECT…) en la cláusula FROM de otra consulta. No es una subconsulta anidada puesto que no aparece dentro de la cláusula WHERE (sino en la FROM) de la consulta exterior. Ejemplos: 1. La siguiente sentencia muestra los datos de los empleados que cobran el máximo salario en cada departamento: SELECT nd, nombred, nss, nombre, apellido, salario FROM (SELECT nd, MAX(salario) AS max_sal FROM Empleado GROUP BY nd), Empleado WHERE max_sal = salario; 2. La siguiente sentencia calcula el número de empleados y la suma de los salarios de los mismos para cada departamento, mostrando dichos datos como el % del total de empleados y de la suma total de los salarios de los empleados de todos los departamentos: SELECT A.numerod “Departamento”, A.num_emp / B.total_emp “%_Empleados”, A.sal_sum / B.total_sal “%_Salario” FROM (SELECT numerod, COUNT(*) AS num_emp, SUM(salario) AS sal_sum FROM Empleado GROUP BY numerod) A, (SELECT COUNT(*) total_emp, SUM(salario) total_sal FROM employees) B; Tema 2. Modelo relacional de datos


Descargar ppt "Consultas anidadas."

Presentaciones similares


Anuncios Google