Vous êtes sur la page 1sur 11

Prctica 1: SQL Fecha: 6 Oct 2009 Conceptos: SQL (DDL y DML)

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.

CREACIN DE UNA TABLA


La base de datos de empresas que vimos en teora constaba de las siguientes tablas: EMPLEADO, DEPARTAMENTO, LOCALIZACIONES_DEPT, PROYECTO, TRABAJA_EN y DEPENDIENTE. Comenzaremos con un ejemplo de creacin de tabla. Escribid en la consola de SQL Plus la siguiente definicin de tabla: 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); Si todo ha ido bin, aparecer el mensaje: Tabla creada. SQL> La tabla Empleado ha sido creada en el sistema y ya podramos introducir datos en ella. Podemos consultar la descripcin de la tabla con el comando DESC. Comprueba que todo cumple con lo descrito en la sentencia de CREATE TABLE anterior. SQL> DESC EMPLEADO; Ejercicios: 1. Borra la tabla Empleado (puedes hacerlo con el comando DROP TABLE ) y crea una nueva tabla Empleado a la que adems de los campos de la tabla original se le haya aadido un CP que guarde el cdigo postal de la residencia del empleado. Qu tipo de dato has utilizado? 2. Introduce la informacin siguiente en tu tabla (puedes mirar en esta parte del enunciado como se construye un insert). Si existe algn dato no descrito aqu para el que tengas que dar algn valor al insertar, asignale un valor que sea consecuente con la informacin actual en la base de datos. 3. Nombre: Jun 4. Inc: J 5. Apellidos: Garca 6. Nmero de Seguridad Social: 1223 7. Fecha de Nacimiento: 7 de Enero de 1957 8. Direccin: C/ Barco, 3 9. Cdigo postal: 1123

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,

FECHA_NCTO DATE, PARENTESCO VARCHAR(8));

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().

INSERCIN DE DATOS. TRANSACCION ES


Antes de definir las claves de las tablas vamos a insertar la informacin para no tener problemas con las restricciones que imponen las claves sobre las tablas. La razn de esto es que la definicin de las claves definen adems Restricciones de Integridad Referencial que impondran problemas del estilo de "la pescadilla que se muerde la cola" ya que todas las relaciones tienen claves externas, con lo que para poder insertar una tupla, se exige previamente tener antes tuplas a las cuales se hace referencia (por esta razn, nunca podramos aadir ninguna tupla a nuestras tablas). Tambin introduciremos el concepto de Transaccin en SQL. Ejecuta el script datosEmpleado.sql para insertar la informacin de los empleados en la tabla Empleado. Comprueba que no se produce ningn error al cargar el script. Todas las actualizaciones que hemos realizado, todava no se han realizado en la propia base de datos, a pesar de que podamos ver su resultado. Esto es debido a que la escritura en la base de datos slo se realiza al finalizar una transaccin. Para finalizar la transaccin actual, ejecuta: SQL> COMMIT;

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

DEFINICIN DE RESTRICCION ES DE CLAVE PRIMARIA Y AJENA


Antes de insertar los datos del resto de tablas, vamos a definir las claves primarias y ajenas para las tablas creadas anteriormente. Un recordatorio informal de lo visto en teora para comprender las sentencias que aparecen a continuacin: Clave primaria (PRIMARY KEY) es un campo o un conjunto de campos de la tabla que identifican unvocamente una tupla (fila) y por tanto ser utilizado su valor para referenciar a esta tupla. Clave alternativa es muy similar a la clave primaria ya que tambin identifica unvocamente una tupla. Puede haber tantas claves alternativas definidas como se quiera, pero slo puede haber una clave primaria en una tabla. Se puede definir con el identificador UNIQUE. Clave ajena o tambin llamada clave externa (FOREIGN KEY) es un campo o conjunto de campos de una tabla que referencia unvocamente a otra tupla. Por ello, para definir una clave ajena dentro de una tabla tenemos que indicar la tabla a la que pertenece la tupla referida y el campo o conjunto de campos de la tabla a que se refiere. Este campo o conjunto de campos debera ser una clave primaria de la tabla referenciada.

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 INSERT INSERT INSERT INSERT INSERT

INTO INTO INTO INTO INTO INTO

TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN TRABAJA_EN

VALUES('999887777',10,10.0); VALUES('987987987',10,35.0); VALUES('987987987',30,5.0); VALUES('987654321',30,20.0); VALUES('987654321',20,15.0); VALUES('888775555',20,null);

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

Vous aimerez peut-être aussi