Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Avda Reina Mercedes s/n. 41012 Sevilla Tlf/Fax 954 557 139 E-mail lsi@lsi.us.es www.lsi.us.es
E.T.S. Ingeniera Informtica
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
Indice
1 2 INTRODUCCIN..................................................................................................................................................................... 3 CREACIN DE TABLAS.......................................................................................................................................................... 3
3.1 SINTAXIS PARA RESTRICCIONES DE INTEGRIDAD. ................................................................. 4 3.1.1 Restricciones sobre columnas. .............................................................................................................. 4 3.1.2 Restricciones sobre tablas. ..................................................................................................................... 5 3.1.3 Ejemplos................................................................................................................................................... 5
4 SQL VS SQL*PLUS.................................................................................................................................................................... 5
4.1 4.2
Pg. 2 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
1 Introduccin.
Las tablas son las unidades bsicas de almacenamiento de datos. Veremos como se crean las tablas en Oracle y como se definen las restricciones de integridad asociadas a dichas tablas. En ausencia de dominios, se definirn las columnas y se asociarn todas las restricciones de integridad semnticas admitidas (Nulos, Claves Primarias, Claves Alternativas (Clasula UNIQUE)) y restricciones de integridad sobre valores de columnas en la tabla (Clusula CHECK).
2 Creacin de tablas.
Para crear una tabla es necesario tener el privilegio CREATE TABLE y un rea de Almacenamiento.
restriccin_columna y restriccin_tabla: son las restricciones impuestas a la columna y tabla. nom_tablespace: indica el espacio lgico donde se quiere almacenar la tabla. Si no se especifica se utiliza el asignado por defecto. nom_cluster: es el nombre del agrupamiento si la tabla forma parte de uno. Las columnas listadas son las columnas que la tabla aporta al agrupamiento, generalmente, las claves primarias. Si se especifica un cluster ya no se especifica el tablespace ya que se utilizar el tablespace donde se encuentra el agrupamiento. consulta: inserta los registros procedentes de una consulta. No se especificarn los tipos de datos ya que se toman de la consulta. La restriccin PRIMARY KEY no se copia y se aade con ALTER TABLE.
2.1.1
Tipos de datos. Tipo Descripcin VARCHAR2 (s) Caracteres de longitud variable. Mximo s caracteres. Lmite 4000 caracteres. CHAR (s) Caracteres de longitud fija. Lmite 2000 caracteres. NUMBER (p,s) Numrico. DATE Fecha/hora LONG Caracteres de longitud variable. Lmite 2Gb. RAW (s) Datos binarios de longitud fija. LONG RAW Datos binarios de longitud variable. Lmite 2Gb.
Pg. 3 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
3 Restricciones de integridad.
Es importante que los datos de una base de datos, estn sujetos a reglas de integridad predefinidas. Oracle permite definir y forzar que se verifiquen las reglas de integridad de los datos declarando Restricciones de Integridad y definiendo Database Triggers. Una Restriccin de Integridad, es un mtodo declarativo de definir una restriccin para una columna de una tabla. Oracle soporta:
Not Null. No admite valores nulos. Unique. Slo admite valores nicos. Primary Key. Clave primaria. Check. Definicin de reglas complejas. Foreign Key. Restricciones de integridad referencial. Soporta las acciones Update y Delete Restrict y Delete Cascade.
Restriccin: nombre que le damos a la restriccin. Por defecto, Oracle le signa SY_Cn, siendo n un entero. NOT NULL: no admite valores nulos. UNIQUE: los valores de la columna son nicos. PRIMARY KEY: la columna es clave primaria. REFERENCES: indica que la columna es clave ajena en una relacin de integridad referencial. ON DELETE CASCADE: Mantiene la integridad referencial eliminando los registros del lado relacionado cuando se eliminan los registros del lado principal de la relacin. CHECK: todo valor que se introduzca en la columna debe cumplir la condicin Admite las mismas expresiones que una clusula WHERE. USING INDEX: indica el tablespace donde se almacenan los ndices generados por UNIQUE y PRIMARY KEY. DISABLE: permite desactivar la restriccin al crearla. Se puede activar con ENABLE/DISABLE del ALTER TABLE.
Pg. 4 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
3.1.2 Restricciones sobre tablas. [CONSTRAINT restriccin] [[UNIQUE | PRIMARY KEY] (columna [, columna] ) | [FOREIGN KEY (columna [, columna] ) REFERENCES [esquema.]tabla [(columna)] [ON DELETE CASCADE] ] | [CHECK (condicin) ] ] [[USING INDEX [TABLESPACE nom_tablespace ]]| DISABLE] 3.1.3 Ejemplos.
NUMBER(2) PRIMARY KEY, VARCHAR2(14), VARCHAR2(10) NOT NULL, dept_dname_uk UNIQUE (Dname), dept_deptno_ck CHECK (Deptno BETWEEN 10 ADND 99);
4 SQL vs SQL*Plus.
SQL es un lenguaje para acceder a los datos del servidor. PL/SQL es un lenguaje procedural de Oracle que extiende SQL con lgica de aplicacin. SQL*Plus es una herramienta de Oracle que permite editar sentencias SQL y PL/SQL, enviarlas al servidor y recoger su respuesta. Tiene su propio lenguaje de comandos. (Ej. el comando DESCRIBE tabla presenta la estructura de una tabla.) Permite crear ficheros de script para almacenar sentencias PL/SQL.
Pg. 5 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
Para ver las tablas que existen en el sistema se puede consultar la tabla tabs (guarda informacin de la estructura de todas las tablas existentes).
Mediante la opcin Spool es posible crear un fichero script. Crea un archivo con extensin .LST donde se almacenarn los script (.sql) creados.
Pg. 6 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
Pg. 7 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
Ejercicio 1.
a) Crear la tabla de empleados. Cada empleado puede tener un jefe o ninguno (null). El jefe es a su vez un empleado por lo que hay una clave ajena definida sobre la misma tabla. CREATE TABLE empleados (cod_emp nom_emp salario fecha_nac comision cod_jefe PRIMARY KEY FOREIGN KEY char(4), char(10) not null, integer DEFAULT 10000, date DEFAULT SYSDATE, integer CONSTRAINT mas_comision CHECK (comision>100), char(4), (cod_emp), (cod_jefe) REFERENCES empleados ON DELETE CASCADE);
Pg. 8 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
c) Borrar datos.
Para borrar las filas y borrar adems la definicin de las tablas en el diccionario de datos se utiliza: DROP TABLE [esquema.]tabla [CASCADE CONSTRAINT] d) Modificar los datos.
Pg. 9 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
Ejercicio 2.
Utilizar las tablas emp y dept 1.- Hacer una consulta sobre la tabla empleados. select * from emp; 2.- Obtener el nombre de todos los departamentos y su localizacin, formateando la columna para una mejor presentacin. Antes de escribir la consulta hay que consultar las columnas de la tabla. desc dept; select dname Nombre Dept, loc Localizacin from Dep; 3.- Listar el nombre, ocupacin y salario de aquellos empleados cuyo salario sea mayor que 1600. select ename, job from emp where sal > 1600; 4.- Obtener aquellos empleados que trabajen en el departamento 20, su sueldo sea mayor que 800 dlares y su nombre empiece por S. select * from emp where deptno=20 and sal > 800 and ename like S%; 5.- Obtener el nombre y el departamento de aquellos empleados que se encuentren en el departamento 10 y 20 y cuya comisin no sea nula. (Aadir al final ordenacin del nombre). select ename,deptno from emp where deptno in (10,20) and comm is not null order by 1 desc; 6.- Obtener de la tabla de empleados un listado con los distintos departamentos en los que los empleados trabajan. select distinct deptno from emp; 7.- Visualizar el nombre, empleo y fecha de incorporacin de aquellos empleados que hayan entrado en la empresa entre las siguientes fechas: 02-APR- 81 y 23-JAN-82. select ename, job, hiredate from emp where hiredate >= to_date('02/04/1981') and hiredate <= to_date('23/01/1982'); select ename, job, hiredate from emp where hiredate between to_date('02/04/1981') and to_date('23/01/1982'); 8.- Queremos que por cada empleado aparezca la siguiente linea: El empleado NOMBRE se dio de alta en la empresa el FECHA. select El empleado ||ename|| se dio de alta en la empresa el ||hiredate from emp; 9.- Por cada jefe o manager obtener el nmero de empleados y la media de sus sueldos + comisiones (en el caso de que las hubiera), solo para los empleados que pertenezcan al departamento 20. Formatear las columnas. No contar al Presidente Ordenar descendente por manager. select mgr Manager, count(*) Num de empleados, AVG(sal+nvl(comm,0)) Media de salarios from emp where mgr is not null group by mgr order by mgr desc; select mgr Manager, count(*) Num de empleados, AVG(sal+nvl(comm,0)) Media de salarios from emp group by mgr having mgr is not null order by mgr desc; Pg. 10 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
10.- Obtener para cada empleado el nombre y la localizacin del departamento en el que se encuentran. select a.ename Empleado, b.dname Departamento ,b.loc Localizacion from emp a, dept b where a.deptno=b.deptno; 11.- De la tabla de departamentos obtener aquellos que tengan al menos un empleado. select * from dept where deptno in (select distinct deptno from emp); 12.- Obtener el nombre y ocupacin de todos aquellos empleados que trabajen en el departamento de SMITH. Select ename, job from emp where deptno = (select deptno from emp where ename=SMITH); 13.- Obtener el nombre y departamento de aquellos empleados cuyo sueldo sea mayor que cualquier salario del puesto de CLERK select ename, deptno from emp where sal > ANY (select sal from emp where job=CLERK); 14.- Obtener los empleados, junto con sus salarios, que ganan ms que la media de su departamento. select a.ename, a.sal, b.promedio from emp a, ( select deptno,avg(sal) AS promedio from emp group by deptno ) b where a.sal > b.promedio and a.deptno=b.deptno; (Estos comandos de actualizacin (insert, update y delete) son bloqueantes, por lo que es posible que las sentencias tarden un poco o no se puedan llevar a cabo) 15.- Realizar las siguientes inserciones: En la tabla de empleados introducir los siguientes empleados: EMPNO: 7935 HIREDATE: Fecha actual ENAME: Santiago SAL: 799 JOB: Clerk COMM:0 MGR: 7902 DEPTNO: 40 Insert into emp values (7935, SANTIAGO, CLERK,7902,SYSDATE,799,0,40); Commit; =================================== EMPNO: 7936 HIREDATE: el 29 de Febrero del 2004 ENAME: Juan SAL: JOB: COMM:5 MGR: DEPTNO: Insert into emp (empno,ename,hiredate,comm) values (7936, JUAN, TO_DATE (29/02/2004,DD/MM/YYYY), 5); Insert into emp values (7936, JUAN, NULL,NULL, TO_DATE (29/02/2004,DD/MM/YYYY), NULL 5,NULL); Commit; En la tabla manager introducir todos aquellos empleados que sean manager: Columna Tipo ID_MGR NUMBER(4) NOT NULL MGR_NAME VARCHAR2(10) SAL NUMBER(7, 2) HIREDATE DATE Pg. 11 de 12
DBD Prctica-1
Sevilla, Febrero 2007, V 2007.02.2
Definicin de datos
insert into manager (id_mgr,mgr_name,sal,hiredate) select empno,ename,sal,hiredate from emp where job=MANAGER; commit; De esta forma podemos introducir ms de una fila a la vez basndonos en otras tablas. (Dos personas no pueden insertar a la vez el mismo registro pero si se pueden realizar inserciones distintas de forma simultanea. En el segmento de rollback se almacen los rowid de las filas que se estn insertando, de tal forma que si hacemos rollback Oracle las puede localizar y borrar. Hasta que no se haga commit las personas que hagan SELECT sobre la tabla no vern las nuevas filas). 16.- Como se haran las siguientes modificaciones? a) Dar una comisin con valor 0 a todos los empleados de la empresa. Update emp set comm=0 ; Commit; b) Actualizar el departamento haciendo que todos pertenezcan al departamento localizado en BOSTON. Update emp set deptno=(select deptno from dept where loc=BOSTON); Commit; c) Bajarle el sueldo al PRESIDENT a 4000. Update emp set sal=4000 where job=PRESIDENT; Commit; (Update funciona bloqueando en la tabla aquellas filas que va a modificar, por lo cual stas no pueden ser consultadas hasta que se ejecute un comando de commit/rollback. A medida que se va realizando la actualizacin los registros antiguos se van almacenando en el segmento de rollback. Si se lleva a cabo una operacin de rollback todos los registros almacenados en el segmento de rollback volvern a su lugar). 17.- Escribir las sentencias necesarias para realizar las siguientes eliminaciones de registros. a) Eliminar todos los registros de la tabla departamentos. Delete from dept; Commit; Truncate table dept; El truncado es ms rpido por las siguientes razones: - No genera informacin de Rollback - No ejecuta los triggers de Delete que la tabla tenga asociados. b) Eliminar aquellos empleados cuyo jefe sea el empleado Clark Delete from emp where mgr = (select empno from emp where ename=CLARK); Commit;
Pg. 12 de 12