Manipulación de datos en SQL Consultas a una sola tabla Consultas a varias tablas Funciones agregadas Agrupación Consultas anidadas Ejemplo: esquema relacional EMPLEADO (num_emp, nombre, tarifa_hora, cualificacion, num_sup) EDIFICIO (num_edi, direccion, tipo, nivel, estado) ASIGNACION (num_emp, num_edi, fecha_ini, num_dias)
Consultas a una sola tabla. Obtener el nombre de todos los fontaneros SELECT NOMBRE WHERE CUALIFICACION= SELECT columnas FROM tabla WHERE condición NUM_EMP NOMBRE TARIFA_HORA CUALIF. NUM_SUP M. Pérez R. Gómez 0 Carpintero P. Morán Pintor H. Rico 8 C. Barrero 7 A. Cerrato 0 Pintor NOMBRE resultado consulta H. Rico
El símbolo * Listar todos los datos sobre edificios de oficinas FROM EDIFICIO WHERE TIPO= Oficina NUM_EDI DIRECCION TIPO NIVEL ESTADO Azcoitia, Oficina Pelícano, 89 Tienda Argüeso, Vivienda Mineros, Oficina Tavira, 78 Oficina Alcalá, 9 Almacén resultado consulta NUM_EDI DIRECCION Azcoitia, TIPO Oficina NIVEL ESTADO Mineros, Oficina Tavira, 78 Oficina
El operador DISTINCT SQL no elimina tuplas repetidas Listar todos los valores de tarifa por hora distintos SELECT DISTINCT TARIFA_HORA 7 NUM_EMP NOMBRE TARIFA_HORA CUALIF. NUM_SUP M. Pérez R. Gómez 0 Carpintero P. Morán Pintor H. Rico 8 C. Barrero 7 A. Cerrato 0 Pintor TARIFA_HORA resultado consulta 0 8 8
El operador DISTINCT (II) Sólo se especifica una vez Ejemplo: hallar todas las combinaciones diferentes de valores de cualificación y tarifa_hora SELECT DISTINCT CUALIFICACION, TARIFA_HORA 9 La cláusula ORDER BY Obtener el nombre y la tarifa_hora de todos los electricistas ordenándolos por nombre en orden creciente, y por tarifa_hora en orden decreciente SELECT NOMBRE, TARIFA_HORA ORDER BY CUALIFICACION, TARIFA_HORA DESC Equivalente a ORDER BY, DESC 0
El operador AS Listar todos los números de empleado junto con el número del edificio al que están asignados SELECT NUM_EMP AS EMPLEADO, NUM_EDI AS EDIFICIO FROM ASIGNACION Expresiones Secuencia de operaciones que, cuando se ejecuta, devuelve valor único Valores numéricos: +, -, *, / Cadenas: CONCAT ( ) SELECT que devuelve un solo valor no se puede especificar ORDER BY si resultado es tabla vacía - valor NULL Pueden aparecer en vez de valor (en SELECT o en WHERE)
Expresiones (II) + A CONCAT B TARIFA_HORA *. TARIFA_HORA + (SELECT TARIFA_HORA FROM EMPLEADO WHERE NUM_EMP = 0) + Expresiones (III) Cuál es el salario semanal para cada electricista? SELECT NOMBRE, Salario semanal =, 0 * TARIFA_HORA WHERE CUALIFICACION=
NUM_EMP NOMBRE TARIFA_HORA CUALIF. NUM_SUP M. Pérez 0 90 R. Gómez 0 Carpintero 90 P. Morán Pintor 0 H. Rico 8 0 C. Barrero 00 A. Cerrato 0 Pintor NOMBRE resultado consulta M. Pérez C. Barrero Salario Semanal = 80 Salario Semanal = 0 Operadores de comparación Quién tiene una tarifa por hora entre 0 y 0 euros? WHERE TARIFA_HORA >= 0 AND TARIFA_HORA <= 0 Operadores de comparación: =, <>, <, >, <=, >= Conectivas booleanas: AND, OR, NOT
El operador BETWEEN Quién tiene una tarifa por hora entre 0 y 0 euros? WHERE TARIFA_HORA BETWEEN 0 AND 0 7 El operador BETWEEN (II) Listar todos las asignaciones de trabajo que empezarán en las próximas dos semanas FROM ASIGNACION WHERE FECHA_INI BETWEEN CURRENT_DATE AND CURRENT_DATE + INTERVAL DAY 8
YEAR, MONTH, DAY Listar todos las asignaciones de trabajo que empezarán en diciembre FROM ASIGNACION WHERE FECHA_INI.MONTH = 9 El operador IN Listar todos los datos sobre fontaneros, carpinteros y electricistas WHERE CUALIFICACION IN (, Carpintero, ) 0
El operador LIKE Listar todos los datos sobre empleados cuya cualificación empieza por Elec WHERE CUALIFICACION LIKE Elec% % - cero o más caracteres _ - un carácter El operador LIKE (II) Listar todos los datos sobre edificios cuya dirección contiene el carácter _ FROM EDIFICIO WHERE DIRECCION LIKE %/_% ESCAPE / definimos carácter de escape anteponemos carácter de escape a _ o %
El operador IS NULL Obtener todos los datos de aquellos empleados que no tienen supervisor WHERE DNI_SUPER IS NULL IS NOT NULL, NOT IN, NOT BETWEEN, NOT LIKE Consultas a múltiples tablas Cuáles son las cualificaciones de los empleados asignados al edificio? SELECT CUALIFICACION, ASIGNACION WHERE EMPLEADO.NUM_EMP = ASIGNACION.NUM_EMP AND NUM_EDI = EMPLEADO (num_emp, nombre, tarifa_hora, cualificacion, num_sup) ASIGNACION (num_emp, num_edi, fecha_ini, num_dias)
Procesamiento de la consulta ASIGNACION EMPLEADO NUM_EMP NUM_EDI FECHA_ INI NUM_ DIAS NUM_EMP NOMBRE TARIFA_ HORA CUALIF. NUM_SUP 0/ 8/0 0 R. Gómez 0 Carpintero 7/ C. Barrero /0 0/08 08/0 NUM_EMP Procesamiento de la consulta (II) Producto cartesiano NOMBRE TARIFA_ HORA CUALIF. NUM_SUP NUM_EMP NUM_EDI FECHA_ INI NUM_ DIAS 0/ 8/0 0 7/ /0 0/08 08/0
Procesamiento de la consulta (III) WHERE E.NUM_EMP NOMBRE TARIFA_ HORA CUALIF. NUM_SUP A.NUM_EMP NUM_EDI FECHA_ INI NUM_ DIAS /0 R. Gómez 0 Carpintero 8/0 0 C. Barrero 08/0 7 Procesamiento de la consulta (IV) SELECT CUALIFICACION Carpintero 8
Otro ejemplo Listar todos los empleados junto con el nombre de su supervisor SELECT A.NOMBREE AS EMPLEADO, B.NOMBREE AS SUPERVISOR A, EMPLEADO B WHERE B.DNI = A.DNI_SUPER 9 Más de dos relaciones Listar los nombres de los empleados asignados a edificios de oficinas SELECT NOMBRE, ASIGNACION, EDIFICIO WHERE EMPLEADO.NUM_EMP = ASIGNACION.NUM_EMP AND ASIGNACION.NUM_EDI = EDIFICIO.NUM_EDI AND TIPO = Oficina EMPLEADO (num_emp, nombre, tarifa_hora, cualificacion, num_sup) ASIGNACION (num_emp, num_edi, fecha_ini, num_dias) EDIFICIO (num_edi, direccion, tipo, nivel, estado) 0
NATURAL JOIN Listar los nombres de los empleados asignados a edificios de oficinas SELECT NOMBRE NATURAL JOIN ASIGNACION NATURAL JOIN EDIFICIO WHERE TIPO = Oficina EMPLEADO (num_emp, nombre, tarifa_hora, cualificacion, num_sup) ASIGNACION (num_emp, num_edi, fecha_ini, num_dias) EDIFICIO (num_edi, direccion, tipo, nivel, estado) INNER y OUTER JOIN INNER JOIN - sólo incluye tuplas que se corresponden OUTER JOIN - incluye además todas las tuplas de una o ambas tablas LEFT, RIGHT, FULL Si se omite tipo de reunión - INNER Si aparece LEFT, RIGHT O FULL se puede omitir OUTER A cualquier tipo (excepto a UNION) podemos anteponerle NATURAL
INNER y OUTER JOIN (II) Nombre de todos los empleados junto con el nombre del departamento que dirigen (si es el caso) SELECT NOMBREE, NOMBRED LEFT JOIN DEPARTAMENTO ON EMPLEADO.dni = DEPARTAMENTO.dni_dir