Práctica 1
Práctica 1
Práctica 1
OBJETIVOS
El objetivo de esta prctica es aprender a utilizar el lenguaje para bases de datos SQL. Este lenguaje es el ms ampliamente extendido entre los principales productos comerciales de bases de datos. Proporciona la funcionalidades de los tipos de lenguajes vistos en teora: DDL (Lenguaje de Definicin de Datos) para definir la estructura de la base de datos y controlar el acceso a los datos DML (Lenguaje de Manipulacin de Datos) para consultar y actualizar datos
La prctica de hoy consistir en crear y utilizar la base de datos de empleados de una empresa segn el ejemplo visto en las clases de teora. Para ello, haremos uso de la aplicacin comercial de bases de datos Oracle 10 instalada en las aulas informticas. Aunque la mayor parte de los ejercicios estn escritos en SQL estndar, lo que posibilitara su ejecucin en cualquier otra aplicacin diferente de Oracle que siga el estndar, existen algunas partes en que se utilizan caractersticas concretas del SQL de Oracle. Los pasos en que esto se produzca se ver indicado con el texto NO ESTNDAR sobre el recuadro del ejercicio.
SQL Plus
Oracle 10 incorpora una herramienta en modo texto para manejar la base de datos usando el lenguaje SQL llamada SQL Plus. Para arrancar la consola de la herramienta desde los ordenadores de Windows se debe ejecutar: Start > Programs > Oracle 9 > SQL * Plus
Para arrancar, la herramienta nos solicitar nuestros datos de conexin a la base de datos. Para poder conectar necesitaremos conocer lo siguiente: Nombre de usuario: En Oracle cada usuario tiene un nico esquema de bases de datos relacional propio asociado, el cual ya est creado con la cuenta. Todas las acciones realizadas por los usuarios se producirn sobre las tablas de su propio esquema; por ello, este nombre de usuario nos permite identificar el esquema que vamos a utilizar. Contrasea: Nos ser proporcionada durante la prctica.
Cadena de conexin: Identifica la instancia de Oracle a la que nos queremos conectar. Una instancia de Oracle es una aplicacin de bases de datos en ejecucin en una mquina.
10. Salario: 30000 11. Nmero de dependientes (ND): 0 12. Qu sucede si insertas varias veces la misma informacin en la tabla? Prubalo ejecutando varias veces la sentencia SQL que utilizaste en el ejercicio anterior. Por qu la base de datos no ha evitado la aparicin de tuplas repetidas en la relacin?
CARGA DE SCRIPTS
Tener que teclear las sentencias de manipulacin de la base de datos de forma interactiva tiene como inconveniente que cualquier error invalida toda la sentencia, y tendramos que volver a escribirla. Para evitar esto, a partir de ahora escribiremos en un fichero de texto las sentencias SQL a utilizar para poder crear la base de datos. Crea un archivo de texto de nombre "creatablas.sql" y pega en l las siguientes sentencias: CREATE TABLE EMPLEADO ( NOMBRE VARCHAR(15) NOT NULL, INC CHAR, APELLIDO VARCHAR(15) NOT NULL, NSS CHAR(9) NOT NULL, FECHA_NCTO DATE, DIRECCION VARCHAR(30), SALARIO DECIMAL(10,2), NSS_SUPERV CHAR(9), ND INT); CREATE TABLE DEPARTAMENTO( NOMBRED VARCHAR(15) NOT NULL, NUMEROD INT NOT NULL, NSS_JEFE CHAR(9) NOT NULL, FECHA_INICIO_JEFE DATE); CREATE TABLE LOCALIZACIONES_DEPT( NUMEROD INT NOT NULL, LOCALIZACIOND VARCHAR(15) NOT NULL); CREATE TABLE PROYECTO( NOMBREP VARCHAR(15) NOT NULL, NUMEROP INT NOT NULL, LOCALIZACIONP VARCHAR(15), NUMD INT NOT NULL); CREATE TABLE TRABAJA_EN( NSSE CHAR(9) NOT NULL, NP INT NOT NULL, HORAS DECIMAL(3,1) NOT NULL); CREATE TABLE DEPENDIENTE( NSSE CHAR(9) NOT NULL, NOMBRE_DEPENDIENTE VARCHAR(15) NOT NULL, SEXO CHAR,
Borra la tabla empleado y ejecuta el script en SQL Plus: NO ESTNDAR SQL> START "creatablas.sql" Verifica que se han creado todas las tablas. Para consultar las tablas que hay actualmente definidas en el esquema escribe: NO ESTNDAR SQL> SELECT TABLE_NAME FROM USER_TABLES; La relacin user_tables es una vista que mantiene informacin sobre todas las tablas creadas por el usuario.
Ejercicio: 1. El comando anterior realiza una consulta que lista todos los campos table_name de la tabla user_tables. Modifica la consulta para que devuelva un nico valor con el nmero de tablas creado actualmente utilizando la funcin count().
Commit complete. Una transaccin es un conjunto de sentencias en SQL que se ejecutan de forma atmica; esto quiere decir, que se considera que la actualizacin que producen todas las sentencias de una transaccin se realiza a la vez y sin ningn proceso externo que interrumpa dicha actualizacin. En Oracle por defecto se considera una misma transaccin todas las sentencias ejecutadas entre dos COMMIT. Puedes volver al estado que posea la base de datos al finalizar la ltima transaccin con ROLLBACK. Para comprobarlo: o o Inserta de nuevo la tupla que referenciaba al empleado Juan Garca que contena esta informacin Consulta la lista de empleados de la base de datos: SQL> SELECT * FROM EMPLEADO; o Ejecuta: SQL> ROLLBACK; o Comprueba que la tupla que acababas de insertar ha desaparecido de la consulta de la lista de empleados
Por todo esto, cada vez que quieras dejar guardados los datos de forma definitiva, debes ejecutar la sentencia COMMIT para finalizar la transaccin actual.
FORMATOS DE FECHA
La introduccin de fechas en Oracle permite el uso de mltiples formatos. En este caso vamos a ver la funcin TO_DATE que permite formater la fecha segn sea necesario. La forma de usar la funcin TO_DATE es la siguiente: TO_DATE( fecha , formato , nls_language ); Ejemplos: TO_DATE( '01-ene-2001', 'DD-MON-YYYY', 'nls_date_language = spanish' ); INSERT INTO DEPENDIENTE VALUES('333445555','Alice','M',TO_DATE( '05-APR-86', 'DD-MON-YY', 'nls_date_language = spanish' ),'HIJA'); En caso de no indicar el idioma de la fecha se supone el que est configurado por defecto en el sistema. Para cambiar el idioma por defecto se puede utilizar ALTER SESSION: ALTER SESSION SET NLS_DATE_LANGUAGE = 'Spanish'; De esta manera tanto las fechas introducidas como las fechas mostradas por Oracle sern en formato espaol. Esto permite acortar la lnea de insercin anterior: INSERT INTO DEPENDIENTE VALUES('333445555','Alice','M',TO_DATE( '05-APR-86', 'DD-MON-YY'),'HIJA');
El segundo argumento indicando el formato exacto de la fecha tambin es opcional, por lo que se puede eliminar si no se desea usar un formato de fecha extrao
Sigue los siguientes pasos: Ejecuta las siguientes sentencias para definir las claves en las tablas anteriormente creadas: ALTER TABLE EMPLEADO ADD PRIMARY KEY(NSS); ALTER TABLE DEPARTAMENTO ADD PRIMARY KEY (NUMEROD); ALTER TABLE DEPARTAMENTO ADD UNIQUE (NOMBRED); ALTER TABLE DEPARTAMENTO ADD FOREIGN KEY (NSS_JEFE) REFERENCES EMPLEADO(NSS);
ALTER TABLE LOCALIZACIONES_DEPT ADD PRIMARY KEY(NUMEROD,LOCALIZACIOND) ; ALTER TABLE LOCALIZACIONES_DEPT ADD FOREIGN KEY(NUMEROD) REFERENCES DEPARTAMENTO(NUMEROD) ; ALTER TABLE PROYECTO ADD PRIMARY KEY(NUMEROP); ALTER TABLE PROYECTO ADD UNIQUE(NOMBREP); ALTER TABLE PROYECTO ADD FOREIGN KEY(NUMD) REFERENCES DEPARTAMENTO(NUMEROD); ALTER TABLE TRABAJA_EN ADD PRIMARY KEY(NSSE, NP); ALTER TABLE TRABAJA_EN ADD FOREIGN KEY(NSSE) REFERENCES EMPLEADO(NSS); ALTER TABLE TRABAJA_EN ADD FOREIGN KEY(NP) REFERENCES PROYECTO(NUMEROP); ALTER TABLE DEPENDIENTE ADD PRIMARY KEY(NSSE, NOMBRE_DEPENDIENTE); ALTER TABLE DEPENDIENTE ADD FOREIGN KEY(NSSE) REFERENCES EMPLEADO(NSS);
Carga los siguientes datos. Ten en cuenta que algunas lneas poseen informacin inconsistente con las restricciones impuestas por las claves anteriormente definidas. Cul es el problema que se produce? A qu crees que es debido? Por el momento inserta todos los datos menos la tupla que te haya dado problemas. INSERT INTO DEPARTAMENTO VALUES('Investigacin',5,'333445555','22-MAY-88'); INSERT INTO DEPARTAMENTO VALUES('Administracin',4,'987654321','01-JAN-95'); INSERT INTO DEPARTAMENTO VALUES('Direccin',1,'888775555','19-JUN-81'); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO LOCALIZACIONES_DEPT LOCALIZACIONES_DEPT LOCALIZACIONES_DEPT LOCALIZACIONES_DEPT LOCALIZACIONES_DEPT VALUES(1,'Houston'); VALUES(4,'Stafford'); VALUES(5,'Bellaire'); VALUES(5,'Sugarland'); VALUES(5,'Houston');
INSERT INTO PROYECTO VALUES('ProductoX',1,'Bellaire',5); INSERT INTO PROYECTO VALUES('ProductoY',2,'Sugarland',5); INSERT INTO PROYECTO VALUES('ProductoZ',3,'Houston',5); INSERT INTO PROYECTO VALUES('Automatizacin',10,'Stafford',4); INSERT INTO PROYECTO VALUES ('Reorganizacin',20,'Houston',1); INSERT INTO PROYECTO VALUES('Nuevos valores',30,'Stafford',4); INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN VALUES('123456789',1,32.5); VALUES('123456789',2,7.5); VALUES('666884444',3,40.0); VALUES('453453453',1,20.0); VALUES('453453453',2,20.0); VALUES('333445555',2,10.0); VALUES('333445555',3,10.0); VALUES('333445555',10,10.0); VALUES('333445555',20,10.0); VALUES('999887777',30,30.0);
INSERT INTO DEPENDIENTE VALUES('333445555','Alice','M','05APR-86','HIJA'); INSERT INTO DEPENDIENTE VALUES('333445555','Theodore','H','25-OCT-83','HIJO'); INSERT INTO DEPENDIENTE VALUES('333445555','Joy','M','03-MAY58','ESPOSA'); INSERT INTO DEPENDIENTE VALUES('987654321','Abner','H','28FEB-42','ESPOSO'); INSERT INTO DEPENDIENTE VALUES('123456789','Michael','H','04JAN-88','HIJO'); INSERT INTO DEPENDIENTE VALUES('123456789','Alice','M','30DEC-88','HIJA'); INSERT INTO DEPENDIENTE VALUES('123456789','Elizabeth','M','05-MAY-67','ESPOSA'); COMMIT
Cada vez que definimos un tipo de clave (primaria, externa, alternativa), o imponemos condiciones sobre los tipos de valores que pueden tomar los campos de una tabla (como la restriccin de valores nulos cuando hemos definido las tablas anteriormente), estamos creando restricciones (constraints). Dependiendo de la base de datos que utilicemos, las restricciones se gestionan de forma diferente. En Oracle, por ejemplo, podemos ver las restricciones definidas sobre la tabla Empleado con la siguiente sentencia: NO ESTNDAR SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='EMPLEADO'; CONSTRAINT_NAME -----------------------------SYS_C003685682 SYS_C003685683 SYS_C003685684 SYS_C003685699 C C C C P
Como podemos ver, ya hay unas restricciones definidas en la tabla Empleado. Estas restricciones vigilan las imposiciones de NOT NULL en algunos atributos de la tabla (tipo C) y la definicin de clave primaria (tipo P). Veremos que si definimos las claves ajenas de la tabla, las restricciones definidas aumentan con las dos nuevas para claves ajenas (tipo R). En Oracle, los tipos de restricciones vienen dados por un carcter contenido en el atributo CONSTRAINT_TYPE; puedes ver los tipos diferentes de restricciones que pueden estar definidos en CONSTRAINT_TYPE aqu. SQL> ALTER TABLE EMPLEADO ADD FOREIGN KEY (NSS_SUPERV) REFERENCES EMPLEADO(NSS); Table altered.
SQL> ALTER TABLE EMPLEADO ADD FOREIGN KEY(ND) REFERENCES DEPARTAMENTO(NUMEROD); Table altered. SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='EMPLEADO'; CONSTRAINT_NAME -----------------------------SYS_C003685682 SYS_C003685683 SYS_C003685684 SYS_C003685703 SYS_C003685699 SYS_C003685718 C C C C R P R
Estas restricciones se chequearn antes de insertar datos en la tabla, impidiendo su actualizacin si no cumple sus requisitos. Si nos hemos equivocado, para eliminar una restriccin podemos ejecutar:
ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>; Donde <table_name> es el nombre de la tabla y <constraint_name> el nombre de la restriccin que queremos eliminar (en la consulta anterior, la de clave primaria SYS_C003685699, por ejemplo). Ejercicios 1. En Oracle la relacin USER_CONSTRAINTS nos permite conocer el nombre de una restriccin (CONSTRAINT_NAME), el tipo de restriccin (CONSTRAINT_TYPE) y el nombre de la tabla sobre la que se ha definido (TABLE_NAME). Usando la relacin USER_CONS_COLUMNS podemos conocer el nombre de una restriccin (CONSTRAINT_NAME), el nombre de la tabla en la que se ha definido (TABLE_NAME) y el nombre del atributo de la tabla en que se aplica (COLUMN_NAME). Crea una consulta que, utilizando ambas tablas, genere un listado con nombre de restriccin, tipo de restriccin, nombre de tabla y nombre de columna. 2. Elimina la restriccin que impeda insertar la tupla anterior y insrtarla.
EJERCICIOS DE CONSULTAS
Realiza las siguientes consultas: 1. Enumere los nombres de los jefes que tienen ms de un familiar dependiente. Se considera que un empleado es jefe si aparece su NSS como NSS_SUPERV de otro empleado al menos. NOTA: Resultado corregido Resultado de la consulta: 2. NOMBRE 3. --------------4. Franklin 5. 6. Recupere los nombres de todos los empleados que no tienen supervisores. Resultado de la consulta: 7. NOMBRE APELLIDO 8. --------------- --------------9. James Borg 10. 11. De cada proyecto ubicado en 'Stafford', haga una lista con el nmero de proyecto, el nmero de departamento controlador y el apellido, direccin y fecha de nacimiento del jefe de departamento, utilizando JOIN... ON. Resultado de la consulta: 12. NUMEROP NUMD APELLIDO DIRECCION FECHA_NC 13. --------- --------- --------------- ----------------------------- -------14. 10 4 Wallace 291 Berry, Bellaire, TX 20/06/41 15. 30 4 Wallace 291 Berry, Bellaire, TX 20/06/41 16. 17. Halle la suma de los salarios de todos los empleados del departamento de 'Investigacin', as como el salario mximo, el salario mnimo y el salario medio en dicho departamento. Debe incluirse en el cmputo el responsable del departamento. Resultado de la consulta: 18. SUM(SALARIO) MAX(SALARIO) MIN(SALARIO) AVG(SALARIO) 19. ------------ ------------ ------------ -----------20. 133000 40000 25000 33250 21. 22. Recupere el nmero de empleados del departamento 'Investigacin'. Debe incluirse en el cmputo el responsable del departamento. Resultado de la consulta: 23. COUNT(*) 24. -------25. 4 26. 27. De cada proyecto, recupere su nmero, su nombre y el nmero de empleados del departamento 5 que trabajen en l CONTANDO AL RESPONSABLE Resultado de la consulta: 28. NUMEROP NOMBREP COUNT(*) 29. ------- --------------- --------30. 1 ProductoX 2 31. 2 ProductoY 3 32. 3 ProductoZ 2 33. 10 Automatizacin 1 34. 20 Reorganizacin 1 35. 36. Contar el nmero total de empleados en cada departamento cuyos salarios rebasen los 10.000 DOLARES , pero slo en el caso de departamentos en los que trabajen ms de DOS EMPLEADOS SIN CONTAR AL RESPONSABLE Resultado de la consulta:
37. NOMBRED COUNT(*) 38. --------------- --------39. Administracin 3 40. Investigacin 4 41. Direccin 3 42. 43. De cada departamento que tenga ms de DOS empleados (ya que no hay ninguno de ms de 5 empleados), recupere el nmero de departamento y el nmero de empleados que ganan ms de 40.000 dlares Resultado de la consulta: 44. NUMEROD COUNT(*) 45. -------- --------46. 4 1