You are on page 1of 8

BASE DE DATOS [GUIA DE EJERCICIOS PROPUESTOS BD]

DISEO DE BASE DE DATOS

La prctica consistir en crear y utilizar la base de datos de empleados de una. Para ello, haremos uso
de la aplicacin comercial de bases de datos Oracle 10, 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.

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;

P r o f . Ing . MSc. Jenny Lizarazo Pgina 1/7


BASE DE DATOS [GUIA DE EJERCICIOS PROPUESTOS BD]
Ejercicios:

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?
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.

Nombre: Jun
Inc: J
Apellidos: Garca
Nmero de Seguridad Social: 1223
Fecha de Nacimiento: 7 de Enero de 1957
Direccin: C/ Barco, 3
Cdigo postal: 1123
Salario: 30000
Nmero de dependientes (ND): 0

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);

P r o f . Ing . MSc. Jenny Lizarazo Pgina 2/7


BASE DE DATOS [GUIA DE EJERCICIOS PROPUESTOS BD]

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. TRANSACCIONES

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:

P r o f . Ing . MSc. Jenny Lizarazo Pgina 3/7


BASE DE DATOS [GUIA DE EJERCICIOS PROPUESTOS BD]

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;

Ejecuta:

SQL> ROLLBACK;

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 RESTRICCIONES 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.

P r o f . Ing . MSc. Jenny Lizarazo Pgina 4/7


BASE DE DATOS [GUIA DE EJERCICIOS PROPUESTOS BD]

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 INTO LOCALIZACIONES_DEPT VALUES(1,'Houston');


INSERT INTO LOCALIZACIONES_DEPT VALUES(4,'Stafford');
INSERT INTO LOCALIZACIONES_DEPT VALUES(5,'Bellaire');
INSERT INTO LOCALIZACIONES_DEPT VALUES(5,'Sugarland');
INSERT INTO LOCALIZACIONES_DEPT 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 INTO TRABAJA_EN VALUES('123456789',1,32.5);


INSERT INTO TRABAJA_EN VALUES('123456789',2,7.5);
INSERT INTO TRABAJA_EN VALUES('666884444',3,40.0);
INSERT INTO TRABAJA_EN VALUES('453453453',1,20.0);
INSERT INTO TRABAJA_EN VALUES('453453453',2,20.0);
INSERT INTO TRABAJA_EN VALUES('333445555',2,10.0);

P r o f . Ing . MSc. Jenny Lizarazo Pgina 5/7


BASE DE DATOS [GUIA DE EJERCICIOS PROPUESTOS BD]

INSERT INTO TRABAJA_EN VALUES('333445555',3,10.0);


INSERT INTO TRABAJA_EN VALUES('333445555',10,10.0);
INSERT INTO TRABAJA_EN VALUES('333445555',20,10.0);
INSERT INTO TRABAJA_EN VALUES('999887777',30,30.0);
INSERT INTO TRABAJA_EN VALUES('999887777',10,10.0);
INSERT INTO TRABAJA_EN VALUES('987987987',10,35.0);
INSERT INTO TRABAJA_EN VALUES('987987987',30,5.0);
INSERT INTO TRABAJA_EN VALUES('987654321',30,20.0);
INSERT INTO TRABAJA_EN VALUES('987654321',20,15.0);
INSERT INTO TRABAJA_EN VALUES('888775555',20,null);

INSERT INTO DEPENDIENTE VALUES('333445555','Alice','M','05-APR-86','HIJA');


INSERT INTO DEPENDIENTE VALUES('333445555','Theodore','H','25-OCT-83','HIJO');
INSERT INTO DEPENDIENTE VALUES('333445555','Joy','M','03-MAY-58','ESPOSA');
INSERT INTO DEPENDIENTE VALUES('987654321','Abner','H','28-FEB-42','ESPOSO');
INSERT INTO DEPENDIENTE VALUES('123456789','Michael','H','04-JAN-88','HIJO');
INSERT INTO DEPENDIENTE VALUES('123456789','Alice','M','30-DEC-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 C
------------------------------ -
SYS_C003685682 C
SYS_C003685683 C
SYS_C003685684 C
SYS_C003685699 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';

P r o f . Ing . MSc. Jenny Lizarazo Pgina 6/7


BASE DE DATOS [GUIA DE EJERCICIOS PROPUESTOS BD]

CONSTRAINT_NAME C
------------------------------ -
SYS_C003685682 C
SYS_C003685683 C
SYS_C003685684 C
SYS_C003685703 R
SYS_C003685699 P
SYS_C003685718 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

2 Recupere los nombres de todos los empleados que no tienen supervisores. Resultado de la consulta:

5. NOMBRE APELLIDO
6. --------------- ---------------
7. James Borg

P r o f . Ing . MSc. Jenny Lizarazo Pgina 7/7


BASE DE DATOS [GUIA DE EJERCICIOS PROPUESTOS BD]

3. 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:

NUMEROP NUMD APELLIDO DIRECCION FECHA_NC


--------- --------- --------------- ------------------------------ --------
10 4 Wallace 291 Berry, Bellaire, TX 20/06/41
30 4 Wallace 291 Berry, Bellaire, TX 20/06/41

4. 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:

SUM(SALARIO) MAX(SALARIO) MIN(SALARIO) AVG(SALARIO)


------------ ------------ ------------ ------------
133000 40000 25000 33250

5.- Recupere el nmero de empleados del departamento 'Investigacin'. Debe incluirse en el cmputo el
responsable del departamento. Resultado de la consulta:

COUNT(*)
--------
4

6.- 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:

NUMEROP NOMBREP COUNT(*)


------- --------------- ---------
1 ProductoX 2
2 ProductoY 3
3 ProductoZ 2
10 Automatizacin 1
20 Reorganizacin 1

7.- 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:

NOMBRED COUNT(*)
--------------- ---------
Administracin 3
Investigacin 4
Direccin 3

8.- 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:

NUMEROD COUNT(*)
-------- ---------
4 1

P r o f . Ing . MSc. Jenny Lizarazo Pgina 8/7

You might also like