Funciones agregadas SUM, AVG, COUNT, MAX y MIN MAX y MIN - seleccionan valor máximo o mínimo en una columna Cuáles son las tarifas por hora máxima y mínima? SELECT MAX(TARIFA_HORA), MIN(TARIFA_HORA) 34 Funciones agregadas: COUNT Cuántos edificios tienen nivel 3? SELECT COUNT(*) FROM EDIFICIO WHERE NIVEL = 3 Cuántos tipos de cualificación existen? SELECT COUNT(DISTINCT CUALIFICACION) Sólo tienen sentido COUNT(*) o COUNT(DISTINCT columna) 35
Funciones agregadas: AVG Cuál es el número medio de días que los empleados están asignados al edificio 2? SELECT AVG(NUM_DIAS) FROM ASIGNACION WHERE NUM_EDI = 2 Cuál es el salario semanal medio? SELECT AVG(40 * TARIFA_HORA) Todas las funciones agregadas, excepto COUNT, pueden utilizarse con expresiones 36 Funciones agregadas: SUM Cuál es el número total de días de fontanero asignados al edificio 1? SELECT SUM(NUM_DIAS) FROM ASIGNACION, EMPLEADO WHERE EMPLEADO.NUM_EMP = ASIGNACION.NUM_EMP AND CUALIFICACION = Fontanero AND NUM_EDI = 1 EMPLEADO (num_emp, nombre, tarifa_hora, cualificacion, num_sup) ASIGNACION (num_emp, num_edi, fecha_ini, num_dias) SUM y AVG deben usarse con columnas numéricas 37
La cláusula GROUP BY Para cada supervisor, cuál es la tarifa por hora más alta pagada a un empleado de ese supervisor? SELECT NUM_SUP, MAX(TARIFA_HORA) GROUP BY NUM_SUP Tuplas divididas en grupos Aplicar SELECT Si en un SELECT aparece una función agregada, el resto tienen que ser también funciones agregadas (con excepción de GROUP_BY) 38 La cláusula GROUP BY (II) Para cada tipo de edificio, cuál es la calidad media para edificios de estado 1? SELECT TIPO, AVG(NIVEL) FROM EDIFICIO WHERE ESTADO = 1 GROUP BY TIPO WHERE GROUP BY 39
La cláusula HAVING Para cada supervisor que supervisa a más de un empleado, cuál es la tarifa por hora más alta de los empleados que supervisa? SELECT NUM_SUP, MAX(TARIFA_HORA) GROUP BY NUM_SUP HAVING COUNT(*) > 1 Diferencia entre WHERE y HAVING WHERE se aplica a tuplas HAVING se aplica a grupos 40 La cláusula HAVING (II) Para cada tipo de edificio, cuál es el nivel medio para edificios con estado 1? Considerar sólo aquellos tipos de edificio con un nivel de calidad máximo no mayor que 3. SELECT TIPO, AVG(NIVEL) FROM EDIFICIO WHERE ESTADO = 1 GROUP_BY TIPO HAVING MAX(NIVEL) <= 3 Orden de procesamiento: WHERE, GROUP_BY, HAVING, SELECT 41
Subconsultas Qué cualificación tienen los empleados asignados al edificio 2? SELECT CUALIFICACION WHERE NUM_EMP IN (SELECT NUM_EMP FROM ASIGNACION WHERE NUM_EDI = 2) subconsulta no correlacionada 42 Subconsultas (II) SELECT CUALIFICACION WHERE NUM_EMP IN (SELECT NUM_EMP FROM ASIGNACION WHERE NUM_EDI = 2) SELECT CUALIFICACION, ASIGNACION WHERE EMPLEADO.NUM_EMP = ASIGNACION.NUM_EMP AND NUMEDI = 2 43
Subconsultas (III) Listar los nombres de los empleados asignados a edificios de oficinas SELECT NOMBRE WHERE NUM_EMP IN (SELECT NUM_EMP FROM ASIGNACION WHERE NUM_EDI IN (SELECT NUM_EDI FROM EDIFICIO WHERE TIPO = Oficina )) 44 Subconsultas (IV) SELECT NOMBRE WHERE NUM_EMP IN (SELECT NUM_EMP FROM ASIGNACION WHERE NUM_EDI IN (SELECT NUM_EDI FROM EDIFICIO WHERE TIPO = Oficina )) SELECT NOMBRE, ASIGNACION, EDIFICIO WHERE EMPLEADO.NUM_EMP = ASIGNACION.NUM_EMP AND ASIGNACION.NUM_EDI = EDIFICIO.NUM_EDI AND TIPO = Oficina 45
Subconsultas (V) Listar los empleados con una tarifa por hora mayor que la de sus supervisores SELECT NOMBRE_EMP A WHERE A.TARIFA_HORA > (SELECT B.TARIFA_HORA B WHERE B.NUM_EMP = A.NUM_SUP) Subconsulta correlacionada 46 Funciones agregadas en subconsultas Qué empleados reciben una tarifa por hora mayor que la media? SELECT NOMBRE_EMP WHERE TARIFA_HORA > (SELECT AVG(TARIFA_HORA) ) 47
Ejemplo: esquema relacional EMPLEADO (numem, numde, tfno, fecna, fecin, salario, comision, numhi, nomem) fecin = fecha de ingreso DEPARTAMENTO (numde, numce, director, tipodirector, presupuesto, depde, nomde) tipodirector = P(propiedad), F(en funciones) depde = número del dpto. del que depende CENTRO (numce, nomce, señas) 48 Ejemplos (I) Obtener por orden alfabético los nombres y salarios medios de los departamentos cuyo salario medio supera al salario medio de la empresa. SELECT nomde, AVG(salario) AS MEDIO NJ DEPARTAMENTO GROUP BY nomde HAVING AVG(salario) > (SELECT AVG(salario) ) ORDER BY nomde 49
Ejemplos (II) Obtener por orden alfabético los nombres de los departamentos ubicados en la calle Atocha. SELECT nomde FROM DEPARTAMENTO WHERE numce IN (SELECT numce FROM CENTRO WHERE señas LIKE %ATOCHA% ) ORDER BY nomde 50 Ejemplos (III) Obtener por orden alfabético los nombres de los departamentos cuyo presupuesto es inferior a la mitad de la suma de los salarios anuales de sus empleados. SELECT nomde FROM DEPARTAMENTO WHERE presupuesto < (SELECT 0.5 * SUM(salario * 14) / 1000 WHERE numde = DEPARTAMENTO.numde) ORDER BY nomde 51
Ejemplos (IV) Obtener los números de empleado, salario y media de salarios del departamento al que pertenecen, para aquellos empleados cuya comisión sea de 1100 euros. SELECT numem, salario, (SELECT AVG(salario) B WHERE B.numde = A.numde) AS SALMEDIO A WHERE comision = 1100 ORDER BY numem 52 Los operadores ALL y SOME Listar los empleados cuya tarifa por hora es mayor que la de todos los electricistas SELECT NOMBRE_EMP WHERE TARIFA_HORA > ALL (SELECT TARIFA_HORA WHERE CUALIFICACION = Electricista ) ALL la condición debe ser cierta para todas las tuplas SOME (ANY) al menos una tupla = SOME es equivalente a IN 53