1 Fundamentos de Bases de Datos Unidad VI Introducción al Lenguaje SQL 6.3 Lenguaje de Manipulación de Datos (LMD o DML) Data Manipulation Language Lenguaje de Manipulación de Datos Proporcionado por los SGBD que permite a los usuarios de la BD llevar a cabo las tareas de consulta o modificación de los datos contenidos en las Bases de Datos del Sistema Gestor de Bases de Datos. Es el lenguaje de manipulación de datos más popular hoy en día, usado para recuperar y manipular datos en una base de datos relacional. Temas 1. Escritura de Comandos Simples en SQL 2. Limitación y ordenamiento de la selección de filas 3. Funciones de una Fila 4. Consulta de Datos de Varias Tablas 5. Funciones de Grupo 6. SubConsultas 7. SQL *Plus 8. Manipulación de Datos 9. Generación de Vistas 10. Otros Objetos de un Banco de Datos 11. Manejo del Acceso de los usuarios 1 Escritura de Comandos Simples en SQL ESTRUCTURA DE LA TABLA EMPLEADOS SQL> desc emp; Name Null? Type ----------------------------------------- -------- ---------------------------EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) DATOS EN LA TABLA EMPLEADOS SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL ---------- ---------- --------- ---------- -------- ---------- ---------- ---------7369 SMITH CLERK 7902 17/12/80 800 7499 ALLEN SALESMAN 7698 20/02/81 1600 7521 WARD SALESMAN 7698 22/02/81 1250 7566 JONES MANAGER 7839 02/04/81 2975 7654 MARTIN SALESMAN 7698 28/09/81 1250 7698 BLAKE MANAGER 7839 01/05/81 2850 7782 CLARK MANAGER 7839 09/06/81 2450 7788 SCOTT ANALYST 7566 19/04/87 3000 7839 KING PRESIDENT 17/11/81 5000 7844 TURNER SALESMAN 7698 08/09/81 1500 7876 ADAMS CLERK 7788 23/05/87 1100 7900 JAMES CLERK 7698 03/12/81 950 7902 FORD ANALYST 7566 03/12/81 3000 7934 MILLER CLERK 7782 23/01/82 1300 14 rows selected. COMM 300 500 1400 0 DEPTNO 20 30 30 20 30 30 10 20 10 30 20 30 20 10 ESTRUCTURA DE LA TABLA DEPARTAMENTO SQL> desc dept; Name Null? Type ----------------------- -------- ---------------DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) DATOS EN LA TABLA DEPARTAMENTO SQL> select * from dept; DEPTNO DNAME LOC ---------- -------------- ------------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON ESTRUCTURA DE LA TABLA GRADOS DE SALARIO SQL> desc salgrade; Name Null? Type ----------------------- -------- --------------GRADE NUMBER LOSAL NUMBER HISAL NUMBER DATOS EN LA TABLA SALGRADE SQL> select * from salgrade; GRADE LOSAL HISAL ---------- ---------- ---------1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 El comando básico SELECT SELECT FROM [DISTINCT] {*, columna [alias],...} tabla; • SELECT muestra las columnas • FROM muestra la tabla Muestra de la estructura tabular SQL> DESCRIBE dept Name Null? ----------------- -------DEPTNO NOT NULL DNAME LOC Type -----------NUMBER(2) VARCHAR2(14) VARCHAR2(13) 2 Limitación y ordenamiento de la selección de filas Limitación de la filas de datos seleccionados • Las filas de datos seleccionados se limitan a través de la cláusula WHERE. SELECT FROM [WHERE [DISTINCT] {*, columna [alias], ...} tabla condicion(es)]; • La cláusula WHERE le sigue a la cláusula FROM. Uso de la cláusula WHERE SQL> SELECT ename, job, deptno 2 FROM emp 3 WHERE job = 'CLERK'; ENAME ---------JAMES SMITH ADAMS MILLER JOB DEPTNO --------- --------CLERK 30 CLERK 20 CLERK 20 CLERK 10 Uso de los operadores de comparación SQL> SELECT ename, sal, comm 2 FROM emp 3 WHERE sal <= comm; ENAME SAL COMM ---------- --------- --------MARTIN 1250 1400 Uso del operador AND AND presupone que ambas condiciones son verdaderas (TRUE). SQL> 2 3 4 SELECT FROM WHERE AND EMPNO --------7876 7934 empno, ename, job, sal emp sal >= 1100 job = 'CLERK'; ENAME ---------ADAMS MILLER JOB SAL --------- --------CLERK 1100 CLERK 1300 Uso del operador OR OR presupone que una condición es verdadera (TRUE). SQL> 2 3 4 SELECT FROM WHERE OR empno, ename, job, sal emp sal >= 1100 job = 'CLERK'; EMPNO ENAME --------- ---------- 7839 7698 7782 7566 7654 KING BLAKE CLARK JONES MARTIN ... 14 rows selected. JOB SAL --------- --------- PRESIDENT MANAGER MANAGER MANAGER SALESMAN 5000 2850 2450 2975 1250 Uso del operador NOT SQL> SELECT ename, job 2 FROM emp 3 WHERE job NOT IN ('CLERK','MANAGER','ANALYST'); ENAME ---------KING MARTIN ALLEN TURNER WARD JOB --------PRESIDENT SALESMAN SALESMAN SALESMAN SALESMAN Ordenamiento en secuencia descendiente SQL> SELECT ename, job, deptno, hiredate 2 FROM emp 3 ORDER BY hiredate DESC; ENAME JOB DEPTNO HIREDATE ---------- --------- --------- --------ADAMS CLERK 20 12-JAN-83 SCOTT ANALYST 20 09-DEC-82 MILLER CLERK 10 23-JAN-82 JAMES CLERK 30 03-DEC-81 FORD ANALYST 20 03-DEC-81 KING PRESIDENT 10 17-NOV-81 MARTIN SALESMAN 30 28-SEP-81 ... 14 rows selected. 3 Funciones de una Fila Trabajo con Funciones de Palabras Muestra del Número de Empleado, Nombre y Departamento del empleado Blake SQL> SELECT empno, ename, deptno 2 FROM emp 3 WHERE ename = 'blake'; no rows selected SQL> SELECT 2 FROM 3 WHERE empno, ename, deptno emp LOWER(ename) = 'blake'; EMPNO ENAME DEPTNO --------- ---------- --------7698 BLAKE 30 Uso de la Función ROUND SQL> SELECT ROUND(45.923,2), ROUND(45.923,0), 2 ROUND(45.923,-1) 3 FROM DUAL; ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1) --------------- -------------- ----------------45.92 46 50 Uso de la Función TRUNC SQL> SELECT TRUNC(45.923,2), TRUNC(45.923), 2 TRUNC(45.923,-1) 3 FROM DUAL; TRUNC(45.923,2) TRUNC(45.923) TRUNC(45.923,-1) --------------- ------------- --------------45.92 45 40 Uso de Funciones de Fecha • MONTHS_BETWEEN ('01-SEP-95','11-JAN-94') 19.6774194 • ADD_MONTHS ('11-JAN-94',6) '11-JUL-94' • NEXT_DAY ('01-SEP-95','FRIDAY') '08-SEP-95' • LAST_DAY('01-SEP-95') '30-SEP-95' Conversión explícita del Tipo de Datos TO_NUMBER NUMERO TO_CHAR TO_DATE PALABRA TO_CHAR FECHA Uso de la Función TO_CHAR con formato numérico SQL> SELECT 2 FROM 3 WHERE SALARY -------$3,000 TO_CHAR(sal,'$99,999') SALARY emp ename = 'SCOTT'; Uso de la Función NVL SQL> SELECT ename, sal, comm, (sal*12)+NVL(comm,0) 2 FROM emp; ENAME SAL COMM (SAL*12)+NVL(COMM,0) ---------- --------- --------- -------------------KING 5000 60000 BLAKE 2850 34200 CLARK 2450 29400 JONES 2975 35700 MARTIN 1250 1400 16400 ALLEN 1600 300 19500 ... 14 rows selected. Uso de la Función DECODE SQL> SELECT job, sal, 2 DECODE(job, 'ANALYST', SAL*1.1, 3 'CLERK', SAL*1.15, 4 'MANAGER', SAL*1.20, 5 SAL) 6 REVISED_SALARY 7 FROM emp; JOB SAL REVISED_SALARY --------- --------- -------------PRESIDENT 5000 5000 MANAGER 2850 3420 MANAGER 2450 2940 ... 14 rows selected. Anidamiento de funciones SQL> SELECT 2 3 FROM 4 WHERE ename, NVL(TO_CHAR(mgr),'No Manager') emp mgr IS NULL; ENAME NVL(TO_CHAR(MGR),'NOMANAGER') ---------- ----------------------------KING No Manager 4 Consulta de Datos de Varias Tablas Consulta de datos de varias tablas EMP EMPNO -----7839 7698 ... 7934 DEPT ENAME ----KING BLAKE ... DEPTNO ... -----... 10 ... 30 MILLER ... 10 DEPTNO -----10 20 30 40 EMPNO DEPTNO LOC ----- ------- -------7839 10 NEW YORK 7698 30 CHICAGO 7782 10 NEW YORK 7566 20 DALLAS 7654 30 CHICAGO 7499 30 CHICAGO ... 14 rows selected. DNAME ---------ACCOUNTING RESEARCH SALES OPERATIONS LOC -------NEW YORK DALLAS CHICAGO BOSTON Consultas con Equijoins SQL> SELECT 2 3 FROM 4 WHERE emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc emp, dept emp.deptno = dept.deptno; EMPNO ENAME DEPTNO DEPTNO LOC ----- ------ ------ ------ --------7839 KING 10 10 NEW YORK 7698 BLAKE 30 30 CHICAGO 7782 CLARK 10 10 NEW YORK 7566 JONES 20 20 DALLAS ... 14 rows selected. Uso de alias para tablas Simplificación de consultas a través del uso de mombres Alias. SQL> SELECT emp.empno, emp.ename, emp.deptno, 2 dept.deptno, dept.loc 3 FROM emp, dept 4 WHERE emp.deptno = dept.deptno; SQL> SELECT e.empno, e.ename, e.deptno, 2 d.deptno, d.loc 3 FROM emp e, dept d 4 WHERE e.deptno = d.deptno; Enlace de más de dos tablas CUSTOMER NAME CUSTID ----------- -----JOCKSPORTS 100 TKB SPORT SHOP 101 VOLLYRITE 102 JUST TENNIS 103 K+T SPORTS 105 SHAPE UP 106 WOMENS SPORTS 107 ... ... 9 rows selected. ORD CUSTID ORDID ------- ------101 610 102 611 104 612 106 601 102 602 ITEM 106 ORDID ITEMID 106 ------ ------... 610 3 21 rows 611 1 612 1 601 1 602 1 ... 64 rows selected. Consultas con Non-Equijoins SQL> 2 3 4 SELECT FROMemp WHERE BETWEEN e.ename, e.sal, s.grade e, salgrade s e.sal s.losal AND s.hisal; ENAME SAL GRADE ---------- --------- --------JAMES 950 1 SMITH 800 1 ADAMS 1100 1 ... 14 rows selected. Consultas con Outer Joins EMP ENAME ----KING BLAKE CLARK JONES ... DEPT DEPTNO -----10 30 10 20 DEPTNO -----10 30 10 20 ... 40 DNAME ---------ACCOUNTING SALES ACCOUNTING RESEARCH OPERATIONS Ningún trabajador en el departamento OPERATIONS Uso de Outer Joins SQL> 2 3 4 SELECT e.ename, d.deptno, d.dname FROM emp e, dept d WHERE e.deptno(+) = d.deptno ORDER BY e.deptno; ENAME DEPTNO DNAME ---------- --------- ------------KING 10 ACCOUNTING CLARK 10 ACCOUNTING ... 40 OPERATIONS 15 rows selected. Self Joins EMP (WORKER) EMPNO ----7839 7698 7782 7566 7654 7499 ENAME -----KING BLAKE CLARK JONES MARTIN ALLEN EMP (MANAGER) MGR ---- EMPNO ----- 7839 7839 7839 7698 7698 7839 7839 7839 7698 7698 ENAME -------KING KING KING BLAKE BLAKE "MGR en la tabla WORKER corresponde a EMPNO en la Tabla MANAGER" Enlace de una tabla consigo misma SQL> SELECT worker.ename||' works for '||manager.ename 2 FROM emp worker, emp manager 3 WHERE worker.mgr = manager.empno; WORKER.ENAME||'WORKSFOR'||MANAG ------------------------------BLAKE works for KING CLARK works for KING JONES works for KING MARTIN works for BLAKE ... 13 rows selected. 5 Funciones de Grupo Tipos de Funciones de Grupo • AVG • COUNT • MAX • MIN • STDDEV • SUM • VARIANCE Uso de las Funciones AVG y SUM Las funciones AVG y SUM pueden aplicarse a datos numéricos. SQL> SELECT 2 3 FROM 4 WHERE AVG(sal), MAX(sal), MIN(sal), SUM(sal) emp job LIKE 'SALES%'; AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) -------- --------- --------- --------1400 1600 1250 5600 Uso de las Funciones MIN y MAX Las funciones MIN y MAX pueden aplicarse a cualquier tipo de datos. SQL> SELECT 2 FROM MIN(hiredate), MAX(hiredate) emp; MIN(HIRED MAX(HIRED --------- --------17-DEC-80 12-JAN-83 Uso de la Función COUNT COUNT(expr) regresa el número de filas con valores No Nulos. SQL> SELECT 2 FROM 3 WHERE COUNT(COMM) ----------4 COUNT(comm) emp deptno = 30; Funciones de Grupo y valores NULOS Las Funciones de Grupo ignoran los valores NULOS en la columna. SQL> SELECT AVG(comm) 2 FROM emp; AVG(COMM) --------550 Uso de la Función NVL con Funciones de Grupo La Función NVL forza a las Funciones de Grupo a sustituir al valor NULO por otro NO NULO. SQL> SELECT AVG(NVL(comm,0)) 2 FROM emp; AVG(NVL(COMM,0)) ---------------157.14286 Uso de la cláusula GROUP BY Todas la columnas de la lista del SELECT que no están contenidas en las Funciones de Grupo, deben estar contenidas en la cláusula GROUP BY. SQL> SELECT deptno, AVG(sal) 2 FROM emp 3 GROUP BY deptno; DEPTNO AVG(SAL) --------- --------10 2916.6667 20 2175 30 1566.6667 Uso de la cláusula GROUP BY para varias columnas. SQL> SELECT deptno, job, sum(sal) 2 FROM emp 3 GROUP BY deptno, job; DEPTNO JOB SUM(SAL) --------- --------- --------10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900 ... 9 rows selected. Uso de la cláusula HAVING SQL> 2 3 4 SELECT FROM GROUP BY HAVING deptno, max(sal) emp deptno max(sal)>2900; filtro... DEPTNO MAX(SAL) --------- --------10 5000 20 3000 6 SubConsultas Uso de las subconsultas SQL> SELECT ename 2 FROM emp 2975 3 WHERE sal > 4 (SELECT sal 5 FROM emp 6 WHERE empno = 7566); ENAME ---------KING FORD SCOTT Ejecución de subconsultas de una fila SQL> 2 3 4 5 6 7 8 9 10 SELECT FROM WHERE AND ename, job emp job = (SELECT FROM WHERE sal > (SELECT FROM WHERE ENAME JOB ---------- --------MILLER CLERK CLERK job emp empno = 7369) 1100 sal emp empno = 7876); Uso de Funciones de Grupo en una subconsulta SQL> SELECT 2 FROM 3 WHERE 4 5 ename, job, sal emp sal = (SELECT FROM ENAME JOB SAL ---------- --------- --------SMITH CLERK 800 800 MIN(sal) emp); Uso del operator ANY en subconsultas de filas múltiples SQL> 2 3 4 5 6 7 SELECT FROM WHERE AND EMPNO --------7654 7521 empno, ename, job,1300 sal 1100 emp 800 sal < ANY 950 (SELECT sal FROM emp WHERE job = 'CLERK') job <> 'CLERK'; ENAME ---------MARTIN WARD JOB --------SALESMAN SALESMAN SAL --------1250 1250 Uso del operador ALL en subconsultas de filas múltiples SQL> SELECT 2 FROM 3 WHERE 4 5 6 EMPNO --------7839 7566 7902 7788 empno, ename, job,1566.6667sal 2175 emp 2916.6667 sal > ALL (SELECT avg(sal) FROM emp GROUP BY deptno); ENAME ---------KING JONES FORD SCOTT JOB --------PRESIDENT MANAGER ANALYST ANALYST SAL ---------5000 2975 3000 3000 7 SQL *Plus Uso de la variable de intercambio & La variable con el prefijo & se usa para solicitar el suministro de un valor por el usuario. SQL> SELECT 2 FROM 3 WHERE empno, ename, sal, deptno emp empno = &employee_num; Enter value for employee_num: 7369 EMPNO ENAME SAL DEPTNO --------- ---------- --------- --------7369 SMITH 800 20 Suministro de nombres de columnas, expresiones y texto al momento de ejecución SQL> 2 3 4 SELECT FROM WHERE ORDER BY empno, ename, job, &column_name emp &condition &order_column; Enter value for column_name: sal Enter value for condition: sal >= 3000 Enter value for order_column: ename EMPNO --------7902 7839 7788 ENAME ---------FORD KING SCOTT JOB SAL --------- --------ANALYST 3000 PRESIDENT 5000 ANALYST 3000 Uso de la variable de intercambio && El doble signo (&&) se utiliza para repetir el uso del valor de una variable y evitar que el usuario deba dar su valor cada vez que se requiere. SQL> SELECT 2 FROM 3 ORDER BY empno, ename, job, &&column_name emp &column_name; Enter value for column_name: deptno EMPNO ENAME JOB DEPTNO --------- ---------- --------- --------7839 KING PRESIDENT 10 7782 CLARK MANAGER 10 7934 MILLER CLERK 10 ... 14 rows selected. Uso del comando ACCEPT ACCEPT SELECT FROM WHERE / dept PROMPT 'Provide the department name: ' * dept dname = UPPER('&dept') Provide the department name: Sales DEPTNO DNAME LOC --------- -------------- ------------30 SALES CHICAGO Editor SQL Cuando se desea un reporte impreso en hoja, se escribe lo siguiente para enviar el reporte a impresora SET PAGESIZE 37 SET LINESIZE 60 SET FEEDBACK OFF TTITLE 'Employee|Report' BTITLE 'Confidential' COLUMN job HEADING 'Job|Category' FORMAT A15 COLUMN ename HEADING 'Employee' FORMAT A15 COLUMN sal HEADING 'Salary' FORMAT $99,999.99 REM ** Insert SELECT statement SELECT job, ename, sal FROM emp WHERE sal < 3000 ORDER BY job, ename / Ejemplo de un Reporte Fri Oct 24 page 1 Employee Report Job Category Employee Salary ----------------------- ----------------------- ----------------CLERK ADAMS $1,100.00 CLERK JAMES $950.00 CLERK MILLER $1,300.00 CLERK SMITH $800.00 MANAGER BLAKE $2,850.00 MANAGER CLARK $2,450.00 MANAGER JONES $2,975.00 SALESMAN ALLEN $1,600.00 SALESMAN MARTIN $1,250.00 SALESMAN TURNER $1,500.00 SALESMAN WARD $1,250.00 Confidential 8 Manipulación de Datos El comando INSERT • Introducción de nuevas filas de datos en una tabla con el comando INSERT. INSERT INTO VALUES tabla [(columna [, columna...])] (valor [, valor...]); • Con esta sintaxis se introduce siempre una sola fila. Introducción de valores especiales La Función SYSDATE proporciona la fecha y hora actuales. SQL> INSERT INTO 2 3 4 VALUES 5 6 1 row created. emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) (7196, 'GREEN', 'SALESMAN', 7782, SYSDATE, 2000, NULL, 10); Introducción de datos de fechas especiales • Adición de un nuevo empleado. SQL> INSERT INTO 2 VALUES 3 4 1 row created. emp (2296,'AROMANO','SALESMAN',7782, TO_DATE('FEB 3,97', 'MON DD, YY'), 1300, NULL, 10); • Confirmación de la adición. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ------- -------- ---- --------- ---- ----- ----2296 AROMANO SALESMAN 7782 03-FEB-97 1300 10 Introducción de valores con la ayuda de variables de intercambio Genere un escrito interactivo con parámetros de intercambio SQL*Plus. SQL> INSERT INTO 2 VALUES 3 dept (deptno, dname, loc) (&department_id, '&department_name', '&location'); Enter value for department_id: 80 Enter value for department_name: EDUCATION Enter value for location: ATLANTA 1 row created. Generación de escritos propios con solicitud de información • ACCEPT guarda el valor de una variable. • PROMPT muestra el texto deseado. ACCEPT ACCEPT ACCEPT INSERT INTO VALUES department_id PROMPT 'Por favor, dé el número del departamento: ' department_name PROMPT 'Por favor, dé el nombre del departamento: ' location PROMPT 'Por favor, dé la localización del departamento: ' dept (deptno, dname, loc) (&department_id, '&department_name', '&location'); Copiado de filas de otra tabla • Escriba el comando INSERT con una subconsulta. SQL> INSERT INTO managers(id, name, salary, hiredate) 2 SELECT empno, ename, sal, hiredate 3 FROM emp 4 WHERE job = 'MANAGER'; 3 rows created. • No use la cláusula VALUES. • Número de columnas y tipo de datos en el INSERT deben coincidir con aquellos en la subconsulta. El comando UPDATE • Con el comando UPDATE se actualizan los datos de una fila. UPDATE SET [WHERE tabla columna = valor [, columna = valor] condicion(es)]; • En caso necesario, puede también actualizar más de una fila. Actualización de las filas de una tabla • La cláusula WHERE determina cuales filas serán cambiadas. SQL> UPDATE emp 2 SET deptno = 20 3 WHERE empno = 7782; 1 row updated. • Si la cláusula WHERE no se usa, todas las filas de la tabla serán cambiadas. SQL> UPDATE employee 2 SET deptno = 20; 14 rows updated. Actualización de varias columnas con una subconsulta Actualización del puesto y departamento del empleado 7698 de tal manera que coincidan con los del empleado 7499. SQL> UPDATE emp 2 SET (job, deptno) = 3 (SELECT job, deptno 4 FROM emp 5 WHERE empno = 7499) 6 WHERE empno = 7698; 1 row updated. Actualización de filas Zeilen con valores de otra tabla Uso de la subconsulta en el comando UPDATE para actualizar filas en una tabla con valores basados en los de otra tabla. SQL> UPDATE employee 2 SET deptno = 3 4 5 WHERE job = 6 7 3 rows updated. (SELECT FROM WHERE (SELECT FROM WHERE deptno emp empno = 7782) job emp empno = 7782); El comando DELETE Eliminación de filas de una tabla se realizan con el comando DELETE. DELETE [FROM] [WHERE tabla condicion(es)]; Borrado de filas de una tabla • Use la cláusula WHERE para determinar cuales filas serán borradas o eliminadas. SQL> DELETE FROM 2 WHERE 1 row deleted. department dname = 'DEVELOPMENT'; • Si la cláusula WHERE no es empleada, todas las filas de la tabla serán eliminadas. SQL> DELETE FROM 4 rows deleted. department; Eliminación de filas de una tabla basándose en valores de otra tabla Use la subconsulta en el comando DELETE para borrar filas de una tabla basándose en valores de otra tabla. SQL> DELETE FROM 2 WHERE 3 4 5 6 rows deleted. employee deptno = (SELECT FROM WHERE deptno dept dname ='SALES'); Guardado de datos (Commit) • Cambie los siguientes datos. SQL> UPDATE emp 2 SET deptno = 10 3 WHERE empno = 7782; 1 row updated. • Guarde (COMMIT) los cambios. SQL> COMMIT; Commit complete. Estatus de los datos después del ROLLBACK Todos los cambios realizados son cancelados con el comando ROLLBACK. • Toda modificación es eliminada. • Se recupera el estatus anterior. • Se cierra el bloqueo de filas. SQL> DELETE FROM employee; 14 rows deleted. SQL> ROLLBACK; Rollback complete. Regresar cambios hasta un Savepoint • Generación de marcas en una transacción con el comando SAVEPOINT. • Regresar hasta esa marca con el commando ROLLBACK TO SAVEPOINT. SQL> UPDATE... SQL> SAVEPOINT update_done; Savepoint created. SQL> INSERT... SQL> ROLLBACK TO update_done; Rollback complete. 9 Generación de Vistas ¿Qué es una Vista? Tabla EMP EMPNO ENAME JOB JOB MGR HIREDATE SAL SAL COMM COMM DEPTNO ----- ------- --------- ----- --------- ----- ----- ------DEPTNO ----7839 KING --------PRESIDENT --------- ---- 17-NOV-81 --------- -----5000 ----- -----10 -7698 BLAKE MANAGER 7839 7782 KING CLARK 7839 01-MAY-81 2850 30 MANAGER PRESIDENT 7839 17-NOV-81 09-JUN-81 2450 5000 10 10 7566 JONES MANAGER 7839 02-APR-81 2975 20 7782 7654 CLARK MARTIN SALESMAN MANAGER 7839 7698 09-JUN-81 28-SEP-81 1250 1500 1400 300 30 10 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 0 30 EMPNO 7844 ENAME JOB 7782 TURNER SALESMAN MILLER CLERK 7698 23-JAN-82 08-SEP-81 ------ 7934 -----------------10 7900 JAMES CLERK 7698 03-DEC-81 7839 7566 KING PRESIDENT 7521 JONES WARD SALESMAN MANAGER 7698 02-APR-81 7839 22-FEB-81 FORD ANALYST 7566 03-DEC-81 7782 207902 CLARK MANAGER 7369 SCOTT SMITH CLERK ANALYST 7902 09-DEC-82 7566 17-DEC-80 7934 7788 MILLER CLERK 20 7788 SCOTT Vista EMPVU10 7876 ADAMS 1500 1300 950 1250 2975 3000 800 3000 30 500 30 20 20 ANALYST 7566 09-DEC-82 3000 20 CLERK 7788 12-JAN-83 1100 20 Generación de una Vista • Genere una Vista con la ayuda de nombres alias para columnas en una subconsulta. SQL> CREATE VIEW salvu30 2 AS SELECT empno EMPLOYEE_NUMBER, ename NAME, sal SALARY 4 FROM emp 5 WHERE deptno = 30; View created. • Seleccione las columas de esta Vista usando los nombres alias. Construcción de Vistas complejas Construya una Vista compleja que contenga Funciones de Grupo y que muestre valores de dos tablas. SQL> 2 3 4 5 6 7 View CREATE VIEW AS SELECT FROM WHERE GROUP BY created. dept_sum_vu (name, minsal, maxsal, avgsal) d.dname, MIN(e.sal), MAX(e.sal), AVG(e.sal) emp e, dept d e.deptno = d.deptno d.dname; Reglas para la ejecución de operaciones DML sobre una Vista • Puede Ud. ejecutar operaciones DML en Vistas simples. • Ud. no puede retirar una fila en caso que la Vista contenga lo siguiente: – Funciones de Grupo – La cláusula GROUP BY – La palabra clave DISTINCT – ... Bloqueo de operaciones DML • Ud. puede asegurarse de que ninguna operación DML tenga lugar, para ésto solo debe adicionarle la opción WITH READ ONLY a la Vista. SQL> 2 3 4 5 6 View CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) AS SELECT empno, ename, job FROM emp WHERE deptno = 10 WITH READ ONLY; created. • Cada intento de ejecución de una operación DML en la Vista conducirá al error del Servidor ORA-01752. 10 Otros Objetos de un Banco de Datos Generación de una Secuencia • Genere una Secuencia con el nombre DEPT_DEPTNO para la Clave Primaria de la tabla DEPT. • No utilice la opción CYCLE. SQL> CREATE SEQUENCE dept_deptno 2 INCREMENT BY 1 3 START WITH 91 4 MAXVALUE 100 5 NOCACHE 6 NOCYCLE; Sequence created. Uso de Secuencias • Adicione el nuevo departamento de “MARKETING” en San Diego. SQL> INSERT INTO 2 VALUES 3 1 row created. dept(deptno, dname, loc) (dept_deptno.NEXTVAL, 'MARKETING', 'SAN DIEGO'); • Muestre el valor actual de la Secuencia DEPT_DEPTNO. SQL> SELECT 2 FROM dept_deptno.CURRVAL dual; Modificación de una Secuencia Modifique el Incremento, el valor Máximo y Mínimo, y la opción Cycle ó Cache. SQL> ALTER SEQUENCE dept_deptno 2 INCREMENT BY 1 3 MAXVALUE 999999 4 NOCACHE 5 NOCYCLE; Sequence altered. Generación de un Índice • Genere un Índice en una o varias columnas. CREATE INDEX índice ON tabla (columna[, columna]...); • Eleve la repidez de una consulta de la columna ENAME de la tabla EMP. SQL> CREATE INDEX 2 ON Index created. emp_ename_idx emp(ename); Generación de índices - Lineamientos • La columna se emplea frecuentemente en una cláusula WHERE ó en una condición JOIN. • La columna contiene un rango de valores alto. • La columna contiene muchos valores NULOS. • Dos ó más columnas se emplean seguido juntas en una cláusula WHERE ó en una condición tipo JOIN. • Se trata de una tabla grande y la mayoría de las consultas reportan menos del 2 - 4% de las filas. Generación de Índices - Lineamientos En los siguientes casos no debe generar índices: • No se trata de una tabla. • Las columnas no se emplean seguido en la consulta. • La mayoría de las consultas reportan más del 2 – 4% de las filas. • La tabla se actualiza con frecuencia. Generación y eliminación de Sinónimos • Genere una abreviación para el nombre de la Vista DEPT_SUM_VU. SQL> CREATE SYNONYM d_sum 2 FOR dept_sum_vu; Synonym Created. • Elimine un Sinónimo. SQL> DROP SYNONYM d_sum; Synonym dropped. 11 Manejo del Acceso de los usuarios Creación de un usuario El DBA crea usuarios con la ayuda del comando CREATE USER. CREATE USER IDENTIFIED BY usuario contraseña; SQL> CREATE USER scott 2 IDENTIFIED BY tiger; User created. Otorgamiento de privilegios del sistema El DBA puede repartir privilegios del sistema específicos al usuario. SQL> GRANT create table, create sequence, create view 2 TO scott; Grant succeeded. Creación de Roles SQL> CREATE ROLE manager; Role created. SQL> GRANT create table, create view 2 to manager; Grant succeeded. SQL> GRANT manager to BLAKE, CLARK; Grant succeeded. Cambio de contraseña • Con la creación de un usuario se inicializa una contraseña. • Los usuarios pueden cambiar su contraseña con el comando ALTER USER. SQL> ALTER USER scott 2 IDENTIFIED BY lion; User altered. Otorgamiento de privilegios de objetos • Otorgue el privilegio SELECT para la tabla EMP. SQL> GRANT select 2 ON emp 3 TO sue, rich; Grant succeeded. • Otorgue el privilegio UPDATE para columnas específicas a usuarios y a roles. SQL> GRANT update (dname, loc) 2 ON dept 3 TO scott, manager; Grant succeeded. Uso de la palabras claves WITH GRANT OPTION y PUBLIC • Déle a un usuario el derecho de otorgar privilegios a terceros. SQL> GRANT select, insert 2 ON dept 3 TO scott 4 WITH GRANT OPTION; Grant succeeded. • Permita a todos los usuarios consultar la tabla alice.dept. SQL> GRANT select 2 ON alice.dept 3 TO PUBLIC; Grant succeeded. Retracción de privilegios sobre Objetos Quítele al usuario los privilegios SELECT e INSERT que el usuario Scott otorgó para la tabla DEPT. SQL> REVOKE select, insert 2 ON dept 3 FROM scott; Revoke succeeded.