Introducción a la Computación Bases de Datos Relacionales III Esteban E. Mocskos (emocskos@dc.uba.ar) Facultad de Ciencias Exactas y Naturales, UBA CONICET 11/06/2013 E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 1 / 16
Resumen La clase pasada vimos estos conceptos Clave foránea (Foreign Key) Distintos sabores de SELECT. Las consultas SQL tiene la siguiente forma: Forma general de una query SELECT FROM WHERE FROM: es una lista de nombres de tablas separadas por coma. WHERE: es una expresión de tipo Boolean, si da True se incluye el registro en el conjunto de salida. Si no hay, se lo toma como TRUE para todos los registros evaluados (se incluyen todos). SELECT: es una lista de nombres de campos separados por coma, son los campos que se incluyen en el resultado. Si se usa SELECT * se devuelven todos los campos. E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 2 / 16
Producto cartesiano La definición viene de la teoría de conjuntos. A B resulta en otro conjunto cuyos elementos son todos los pares ordenados que se forman tomando el primer elemento del primer conjunto, y el segundo elemento del segundo conjunto. Por ejemplo: A = {1, 2, 3, 4} y B = {a, b}, su producto cartesiano es: A B = {(1, a), (1, b), (2, a), (2, b), (3, a), (3, b), (4, a), (4, b)} El producto cartesiano también puede calcularse en SQL (en lenguaje de Base de Datos, se nota A.B): Producto cartesiano en SQL SELECT * FROM A, B E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 3 / 16
Join El resultado obtenido al hacer el producto cartesiano puede ser bastante grande. Si A = n, B = m, entonces A B = n m. La combinación del producto cartesiano y la selección de una parte es común en las queries. Por este motivo, se crea una operación especial que se llama join. Hacer un join es filtrar del producto cartesiano, aquellos pares ordenados que cumplan con una condición particular (un predicado). Por ejemplo: A = {1, 2, 3, 4} y B = {a, b}, A B = {(1, a), (1, b), (2, a), (2, b), (3, a), (3, b), (4, a), (4, b)} Predicado: la primer coordenada sea mayor a 2. Producto cartesiano en SQL SELECT * FROM A, B WHERE A.field> 2 A diferencia de los conjuntos, las tablas tienen campos con nombre. E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 4 / 16
Las tablas con las que estuvimos trabajando DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON EMP EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 SMITH CLERK 7902 17-DEC-90 4000 20 7499 ALLEN SALESMAN 7698 20-FEB-91 8000 2400 30 7521 WARD SALESMAN 7698 22-FEB-91 6250 2500 20 7566 JONES MANAGER 7839 02-APR-81 14875 20 7654 MARTIN SALESMAN 7698 28-SEP-91 6250 1400 20 7698 BLAKE MANAGER 7839 01-MAY-91 14250 20 7782 CLARK MANAGER 7839 09-JUN-91 12250 20 7788 SCOTT ANALYST 7566 09-DEC-92 15000 20 7839 KING PRESIDENT 17-NOV-91 25000 20 7844 TURNER SALESMAN 7698 09-SEP-91 7500 0 20 7876 ADAMS CLERK 7788 12-JAN-93 5500 20 7900 JAMES CLERK 7698 03-DEC-91 4750 20 7902 FORD ANALYST 7566 03-DEC-91 15000 20 7934 MILLER CLERK 7782 23-JAN-92 6500 20 E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 5 / 16
Trabajando con un join Cómo haríamos una consulta que devuelva los empleados junto con el nombre del deptarmento en el que trabajan? Primer consulta con join SELECT * FROM DEPT, EMP WHERE EMP.DEPTNO=DEPT.DEPTNO Cuántos registros tiene el resultado? EMP.DEPT(EMP.DEPTNO=DEPT.DEPTNO) EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME LOC 7369 SMITH CLERK 7902 17-DEC-90 4000 20 20 RESEARCH DALLAS 7499 ALLEN SALESMAN 7698 20-FEB-91 8000 2400 30 30 SALES CHICAGO 7521 WARD SALESMAN 7698 22-FEB-91 6250 2500 20 20 RESEARCH DALLAS 7566 JONES MANAGER 7839 02-APR-81 14875 20 20 RESEARCH DALLAS 7654 MARTIN SALESMAN 7698 28-SEP-91 6250 1400 20 20 RESEARCH DALLAS 7698 BLAKE MANAGER 7839 01-MAY-91 14250 20 20 RESEARCH DALLAS 7782 CLARK MANAGER 7839 09-JUN-91 12250 20 20 RESEARCH DALLAS 7788 SCOTT ANALYST 7566 09-DEC-92 15000 20 20 RESEARCH DALLAS 7839 KING PRESIDENT 17-NOV-91 25000 20 20 RESEARCH DALLAS 7844 TURNER SALESMAN 7698 09-SEP-91 7500 0 20 20 RESEARCH DALLAS 7876 ADAMS CLERK 7788 12-JAN-93 5500 20 20 RESEARCH DALLAS 7900 JAMES CLERK 7698 03-DEC-91 4750 20 20 RESEARCH DALLAS 7902 FORD ANALYST 7566 03-DEC-91 15000 20 20 RESEARCH DALLAS 7934 MILLER CLERK 7782 23-JAN-92 6500 20 20 RESEARCH DALLAS Debería tener tantos como la tabla original EMP E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 6 / 16
Un poco de detalle Qué pasó con los departamentos BOSTON y NEW YORK? No aparecen en ningún registro del resultado. Por qué? Procedimiento de join crear una tabla temporaria T foreach t A do foreach u B do if predicado(t u) then insertar t u en T fi od od devolver T En este caso t u corresponde a crear un nuevo registro en base a la concatenación de los registros t y u. E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 7 / 16
Cambiemos levemente el problema DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON EMP EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7521 WARD SALESMAN 7698 22-FEB-91 6250 2500 20 7566 JONES MANAGER 7839 02-APR-81 14875 7654 MARTIN SALESMAN 7698 28-SEP-91 6250 1400 7698 BLAKE MANAGER 7839 01-MAY-91 14250 20 7782 CLARK MANAGER 7839 09-JUN-91 12250 7788 SCOTT ANALYST 7566 09-DEC-92 15000 20 7839 KING PRESIDENT 17-NOV-91 25000 20 7844 TURNER SALESMAN 7698 09-SEP-91 7500 0 20 7876 ADAMS CLERK 7788 12-JAN-93 5500 20 7900 JAMES CLERK 7698 03-DEC-91 4750 E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 8 / 16
Qué pasaría en este caso? Supongamos que al quitar los registros (solo por comodidad) no rompí ninguna de las restricciones existentes. Ejecutemos la siguiente consulta: Misma consulta que antes SELECT * FROM DEPT, EMP WHERE EMP.DEPTNO=DEPT.DEPTNO Cuántos registros devuelve? EMP.DEPT(EMP.DEPTNO=DEPT.DEPTNO) EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME LOC 7521 WARD SALESMAN 7698 22-FEB-91 6250 2500 20 20 RESEARCH DALLAS 7698 BLAKE MANAGER 7839 01-MAY-91 14250 20 20 RESEARCH DALLAS 7788 SCOTT ANALYST 7566 09-DEC-92 15000 20 20 RESEARCH DALLAS 7839 KING PRESIDENT 17-NOV-91 25000 20 20 RESEARCH DALLAS 7844 TURNER SALESMAN 7698 09-SEP-91 7500 0 20 20 RESEARCH DALLAS 7876 ADAMS CLERK 7788 12-JAN-93 5500 20 20 RESEARCH DALLAS Solo quedan aquellos que evalúa a TRUE el predicado o propiedad, aquellos que no tiene contraparte, se descartan. E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 9 / 16
Otra forma de expresar la misma consulta Esto se llama impĺıcita: SELECT * FROM DEPT, EMP WHERE EMP.DEPTNO=DEPT.DEPTNO Esta se llama forma expĺıcita: SELECT * FROM DEPT JOIN EMP ON EMP.DEPTNO=DEPT.DEPTNO Las dos dan el mismo resultado. E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 10 / 16
Más formas de hacer joins Natural join: SELECT * FROM DEPT NATURAL JOIN EMP. Es una manera corta de hacer un join por igualdad entre las columnas cuyos nombres coinciden en las dos tablas (en el caso particular del ejemplo, se compara DEPTNO en las dos tablas). Outer join: a diferencia del join que vimos hasta ahora, no se descarta los registros que no tiene contraparte en la otra tabla, se dejan en el resultado y se completa la información faltanto con NULL. Se usa la sintaxis expĺıcita. Hay tres tipos: left outer joins: se dejan todos los registros de la tabla de izquierda. right outer joins: idem anterior, pero se dejan todos los de la tabla de la derecha full outer joins: adivinen... E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 11 / 16
Aggregations Las funciones de agregación (Aggregation functions) son funciones definidas de un conjunto o multiconjunto (que admite repetición) a un único valor. Ejemplo: min({42, 57, 5, 13, 27})= 5. La función mínimo toma un conjunto de valores y devuelve el mínimo de todos ellos (va de un conjunto a un único valor). Las funciones de agregación se utilizan para extraer información a partir de un conjunto de valores o registros. En la terminología de base de datos, se las conoce como funciones de grupo (group functions). En este caso, la función toma como entrada el conjunto de valores de una columnas (o un subconjunto de una columna) y devuelve un único valor. Los principales usos son: estadísticas, análisis de datos, generación de reportes. En el standard SQL-92 se definen cinco funciones principales de agregación: COUNT, SUM, AVG, MAX, MIN. Algunos DBMS tienen otras adicionales: CORRELATION, STDDEV, VARIANCE, FIRST, LAST. Puede haber más, hay que mirar la documentación del motor utilizado. E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 12 / 16
Cómo funciona la agregación Algunas funciones de agregación son sensibles a tener duplicados: SUM, COUNT, AVG Algunos no son sensibles a duplicados: MIN, MAX Hay que tener a mano el uso de DISTINCT para evitarse problemas. Ejemplo de uso de agrecición SELECT MAX(SAL), AVG(SAL) FROM EMP Restricciones de las queries con funciones de agregación: No se pueden anidar. Las funciones de agregación no pueden usarse en el WHERE: WHERE SUM(A)>200 no funciona! En este tipo de consultas, no se pueden agregar otras columnas que no sean funciones de agregación: SELECT SAL, MGR, AVG(SAL) FROM EMP no funciona! E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 13 / 16
GROUP BY GROUP BY se usa para construir particiones de los registros de una tabla (subconjuntos disjuntos, intersección vacía entre ellos). Las funciones de agregación puede aplicarse, entonces a las particiones individualmente, logrando tener resultados parciales. Ejemplo de uso de GROUP BY SELECT JOB, MAX(SAL), AVG(SAL) FROM EMP GROUP BY JOB De esta manera, se pueden obtener los datos por tipo de salario (se agrupan los registros que tienen igual JOB). Por como esta definido el GROUP BY, necesariamente tiene que tener un atributo que es único para cada partición de los registros (en nuestro ejemplo es JOB). Esto atributos pueden agregarse al SELECT E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 14 / 16
HAVING Vimos que las funciones de agregación no pueden usarse en el WHERE. Si queres filtrar alguna de las particiones que devuelve el GROUP BY, Cómo podríamos hacer? Se puede combinar GROUP BY con HAVING para quedarse solo con aquellas particiones que cumplan con alguna condición. Por ejemplo, nos podemos quedar con los que tengan promedio de salario superior a 10000: Ejemplo de uso de GROUP BY filtrado con HAVING SELECT JOB, MAX(SAL), AVG(SAL) FROM EMP GROUP BY JOB HAVING AVG(SAL)>10000 La condición del HAVING solo puede incluir a las funciones de agregación y a los atributos que definen las particiones del GROUP BY. E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 15 / 16
Tarea Usando las tablas EMP y DEPT que definos durante las clase pasadas, hacer: 1 Modificar el esquema de base de datos usando SQLite Studio para modelar el sueldo bruto mensual de cada empleado. Seleccionar los atributos y las modificaciones necesarias al esquema anterior. 2 Llenar La tabla nueva con información de prueba (una cantidad de registros razonables) que incluya las sueldos de al menos cuatro empleados durante los años 2005, 2006, 2007 y 2008. 3 Hacer una consulta que devuelva el mayor de los sueldos de todos los tiempos. 4 Hacer una consulta que devuelva el promedio histórico de sueldos para los vendedores. 5 Hacer una consulta que devuelva todos los sueldos en un período dado para un departamento dado. 6 Hacer una consulta que devuelva el salario máximo, el mínimo y el promedio agrupado por Departamento (deberá mostrar el nombre de departamento en el resultado de la consulta). 7 Hacer una consulta que devuelva el salario máximo, el mínimo y el promedio agrupado por tipo de trabajo, pero solo si el sueldo promedio del grupo es mayor al promedio general de la empresa. E. Mocskos (UBA CONICET) Clase 15: Bases de Datos III 11/06/2013 16 / 16