Unidad Lenguaje SQL (Structured Query Language) 1
SQL Definición DDL Consulta y Actualización DML Create Alter Drop Select Insert Update Delete 2
SQL DDL CREATE TABLE nombre_tabla (nombre_columna tipo_dato/dominio [NOT NULL] [nombre_columna [DEFAULT valor], tipo_dato/dominio [NOT NULL] [DEFAULT valor],...], [ PRIMARY KEY (nombre_columna [, nombre_columna,...]), ] [ FOREIGN KEY (nombre_columna [, nombre_columna,...]), REFERENCES nombre_tabla (nombre_columna [, nombre_columna,...]) ]; 3
SQL DDL DROP TABLE nombre_tabla [RESTRICT/CASCADE]; 4
SQL DDL ALTER TABLE nombre_tabla ADD nombre_columna tipo_dato/dominio* [NOT NULL] [DEFAULT valor]; ALTER TABLE nombre_tabla DROP nombre_columna; 5
SQL - DML (Actualización) Inserción de tuplas Modificación de tuplas Eliminación de tuplas 6
DML - Inserción 1. INSERT INTO <tabla> [<columna i,, columna j>] VALUES (<valor i,, valor j>); Para cada columna debe ser especificado un valor. Si no se especifica una columna de la tabla, se almacenará en ella un valor nulo. Si no se especifican las columnas se asumirá el orden especificado en el create. 7
DML - Inserción 2. INSERT INTO <tabla> [<columna i,, columna j>] <query>; insert into hr.jobs select * from otrohr.jobs; 8
DML - Modificación 1. UPDATE <tabla> SET <columna i> = <expresión i>,, <columna j> = <expresión j> [WHERE <condición>]; <expresión> puede ser una constante, una expresión aritmética o un query. UPDATE EMP SET sal = (select min(sal) from EMP where job= MANAGER ) WHERE job= SALESMAN and deptno=20; 9
DML - Modificación 2. UPDATE <tabla> SET (<columna i,, columna j>) = <query> [WHERE <condición>];; 10
DML Eliminación DELETE FROM <tabla> [WHERE <condición>];; 11
SQL DML (consultas) SQL ALGEBRA multiconjunto o bolsa conjunto 12
SQL DML (consultas) SELECT lista_atributos FROM [nombre_tabla [, nombre_tabla,...]] / [join] [WHERE condición] [UNION UNION ALL INTERSECT MINUS Subconsulta] [GROUP BY lista_atributos [HAVING condición]] [ORDER BY lista_atributos]; 13
SQL DML (consultas) [join] :: = nom_tabla1 NATURAL JOIN nom_tabla2 / nom_tabla1 JOIN nom_tabla2 ON condición / nom_tabla1 INNER JOIN nom_tabla2 ON condición / nom_tabla1 LEFT [OUTER] JOIN nom_tabla2 ON condición / nom_tabla1 RIGHT [OUTER] JOIN nom_tabla2 ON condición 14
DML Tablas Ejemplo Tabla DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 4 filas 15
DML Tablas Ejemplo Tabla EMP EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK 7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782 17/12/80 20/02/81 22/02/81 02/04/81 28/09/81 01/05/81 09/06/81 19/04/87 17/11/81 08/09/81 23/05/87 03/12/81 03/12/81 23/01/82 800 1600 1250 2975 1250 2850 2450 3000 5000 1500 1100 950 3000 1300 1400 0 20 30 30 20 30 30 10 20 10 30 20 30 20 10 14 filas 16
DML - Proyección Los valores que se pueden proyectar en una consulta son: Atributos Constantes Expresiones Funciones 17
DML Proyección (atributo) π <epno, ename> EMP SELECT epno, ename FROM EMP; (proyección1.sql) 18
DML Proyección (atributo) π<job> EMP SELECT job FROM EMP; SELECT distinct job FROM EMP; (proyección2.sql) (proyección3.sql) 19
DML Proyección (atributo) EMP SELECT * FROM EMP; (proyección4.sql) Proyecta todos los atributos de la tabla resultante 20
DML Proyección (atributo) ρ (nombre) (π<ename> EMP ) SELECT ename AS nombre FROM EMP; (proyección5.sql) 21
DML Proyección (expresión-constante) (proyección6.sql) SELECT ename as nombre, sal/2 as salario_quincena FROM EMP; (proyección7.sql) SELECT ename as nombre, cobra quincenalmente, sal/2 as salario_quincena, pesos FROM EMP; 22
DML Proyección (función) SELECT count(*) FROM EMP; (proyección8.sql) 23
DML - Selección π empno,ename (σ deptno=20 (EMP)) SELECT empno, ename FROM EMP WHERE DEPTNO=20; (selección1.sql) 24
DML - Selección SELECT empno, ename FROM EMP WHERE DEPTNO=20 and SAL<1000; La condición puede utilizar cualquiera de los operadores relacionales y operadores lógicos para generar expresiones más complejas (para cualquier tipo de dato). 25
DML - Selección SELECT empno, ename FROM EMP WHERE DEPTNO is null; La condición puede utilizar el operador is que permite evaluar si un atributo tiene un valor nulo o no. 26
DML - Selección SELECT * FROM scott.emp WHERE ename LIKE 'A%'; (selección2_1.sql) El operador like compara parte de una cadena de caracteres, donde: % sustituye a una cantidad arbitraria de caracteres _ sustituye a un solo carácter 27
Operadores de comparación para consultas simples (sin subqueries) Operadores de comparación de conjuntos <columna> [NOT] IN (<lista de valores>) Select * from EMP where DEPTNO in (20,30); Operadores de valores nulos <columna> IS [NOT] NULL (ya vimos un ejemplo) Operadores de condiciones de dominios <columna> [NOT] BETWEEN <valor inferior> AND <valor superior> 28
Operadores de comparación para consultas más complejas (con subqueries) Un subquery valuado en valor <expresión> [NOT] IN (<subquery>) En este caso <expresión> es comparada con el conjunto que devuelve el subquery 29
Operadores de comparación para consultas más complejas (con subqueries) Un subquery para test de existencia <NOT> EXISTS (<subquery>) En este caso: Exists: Evalúa verdadero si el subquery devuelve tuplas. Not Exists: Evalúa verdadero si el subquery no genera tuplas, es decir, devuelve una tabla vacía. 30
Ejemplo Mostrar todos los datos de los departamentos que no tienen empleados SELECT * FROM scott.dept WHERE not exists (SELECT * FROM scott.emp WHERE emp.deptno = dept.deptno); 31
DML Ordenamiento SELECT...... [ORDER BY lista_atributos ASC/DESC]; Ordena la salida (tabla resultante) según el/los atributos especificados 32
DML Producto Cartesiano EMP x DEPT SELECT * FROM EMP, DEPT; (producto.sql) 33
DML Natural Join π ename, job, dname (EMP * DEPT) SELECT ename, job, dname FROM EMP NATURAL JOIN DEPT; (join2.sql) (Los atributos sobre los cuales se hace el JOIN deben tener el mismo nombre en ambas tablas) 34
DML Natural Join construído con producto cartesiano SELECT epno,ename, job, mgr, hiredate, sal, comm, deptno, dname, loc FROM EMP, DEPT (join1.sql) WHERE EMP.deptno= DEPT.deptno; 35
DML Join π ename, job, dname (EMP EMP.deptno = DEPT.deptno DEPT) SELECT ename, job, dname FROM EMP JOIN DEPT ON EMP.deptno = DEPT.deptno; SELECT ename, job, dname FROM EMP INNER JOIN DEPT ON EMP.deptno = DEPT.deptno; (join3.sql) (join3_1.sql) 36
DML Join con restricción extra SELECT ename, job, dname FROM EMP JOIN DEPT ON EMP.deptno = DEPT.deptno WHERE EMP.deptno = 10; (join4.sql) 37
DML Outer Join LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN 38
DML Left Outer Join SELECT deptno,dname, ename, job FROM DEPT NATURAL JOIN EMP; (join5.sql) El departamento 40 no sale informado porque no existe ningún empleado asignado a él SELECT DEPT.deptno,dname, ename, job FROM DEPT LEFT OUTER JOIN EMP ON DEPT.DEPTNO=EMP.DEPTNO; (join6.sql) El departamento 40 sale informado a pesar de que no existen empleados asignados a él 39
DML Right Outer Join SELECT deptno,dname, ename, job FROM EMP NATURAL JOIN DEPT; (join5.sql) El departamento 40 no sale informado porque no existe ningún empleado asignado a él SELECT ename, job, dept.deptno,dname (join7.sql) FROM EMP RIGHT OUTER JOIN DEPT ON DEPT.DEPTNO=EMP.DEPTNO; El departamento 40 sale informado a pesar de que no existen empleados asignados a él 40
DML Full Outer Join SELECT lista_atributos FROM nombre_tabla FULL OUTER JOIN nombre_tabla ON condición; 41
DML Union π ename (σ deptno=20 or deptno=30 EMP) π ename (σ deptno=20 EMP) U π ename (σ deptno=30 EMP) SELECT ename FROM EMP WHERE deptno=20 or deptno=30 ; (union1.sql) SELECT ename FROM EMP WHERE deptno=20 UNION SELECT ename FROM EMP WHERE deptno=30; 42
DML Union All En este caso, si existen tuplas repetidas no se eliminan. 43
DML Intersección Departamentos que tienen administrativos y analistas entre sus empleados (CLERK y ANALYST) π deptno (σ job=`clerk EMP) π deptno (σ job=`analyst EMP) 44
DML Intersección Departamentos que tienen administrativos y analistas entre sus empleados (CLERK y ANALYST) Select deptno (intersección1.sql) from emp where job='clerk' INTERSECT Ver Select deptno (depts_jobs.sql) from emp where job= ANALYST'; 45
DML Intersección Departamentos que tienen administrativos y analistas entre sus empleados (CLERK y ANALYST) SELECT dept.deptno, dname (intersección2.sql) from dept where deptno in ((Select deptno from emp where job='clerk') and deptno in (Select deptno from emp where job= ANALYST')); 46
DML Minus Departamentos que no tienen empleados π deptno Dept π deptno EMP select deptno from dept minus select deptno from emp; select deptno from dept where deptno not in (select deptno from emp); (minus1.sql) (minus2.sql) 47
DML: In / Not In - Exists / Not Exists Las subconsultas vinculada con un In pueden seleccionar más de un atributo, obviamente compatible con los atributos expresados en el where. Todas las consultas resueltas con IN pueden ser resueltas con Exists. Idem para los negados (Not In Not Exists) 48
DML: División π x,y A DIVIDE BY π y B select A.x from A where not exists (select * from B where not exists (select * from A AX where AX.x=A.x and AX.y=B.y)); 49
DML: Alias SELECT lista_atributos FROM nombre_tabla nombre_alias...; 50
DML Funciones de Resumen - SUM - AVG - COUNT - MAX - MIN 51
DML Funciones Resumen SELECT Sum(nombre_atributo*) FROM nombre_tabla; SELECT Avg(nombre_atributo*) FROM nombre_tabla; SELECT Count(*) FROM nombre_tabla; (resumen salario emp.sql) * El atributo debe ser numérico 52
DML Grupos SELECT... (agrup cantidad emp x... depto.sql) [GROUP BY lista_atributos [HAVING condición]]; (agrup con join.sql) Agrupa las tuplas que tienen igual valor del/ de los atributos especificados en lista_atributos. Muestra una tupla representativa del grupo (resume el grupo). Este valor debe ser único al grupo y además si es un atributo, debe estar especificado en la cláusula group by. 53
DML Grupos SELECT...... [GROUP BY lista_atributos [HAVING condición]]; Selecciona los grupos que cumplen la condición (agrup cantidad emp x depto con condicion.sql) 54
Análisis de consultas SQL Una consulta SQL se evalúa conceptualmente así: Primero FROM, seguido de WHERE, en tercer lugar GROUP BY y por último ORDER BY. Si no hay GROUP BY ni ORDER BY, para cada combinación de tuplas (una de cada tabla de FROM), se evalúa la condición de WHERE. Si es cierta se colocan en el resultado los valores correspondientes a los atributos del SELECT. Esta NO es una forma eficiente de implementar una consulta SQL. Así pues, cada SGBD tiene rutinas de optimización. 55
Vistas CREATE VIEW <nombre de la vista> [<columna(s)>] AS <sentencia select> [ WITH CHECK OPTION ]; Si [<columna(s)>] no está especificado, las columnas toman el mismo nombre de los correspondientes a la trabla generada en la sentencia select. Una vista puede ser usada en una sentencia SELECT en forma idéntica que una tabla. Una vista es evaluada cada vez que es accedida. No toda vista puede ser actualizada (insert, update, delete). 56