Está en la página 1de 12

DAE : Desarrollo de Aplicaciones en Entornos de 4ª generación y con Herramientas CASE.

Ciclo Superior Desarrollo Aplicaciones Informáticas.


Profesor: Juan Maza

 Objetivos
 SQL Plus
Práctica 1: SQL  Creación de una tabla
 Carga de Scripts
Fecha: 10 Dic 2009  Inserción de datos.
Transacciones
Conceptos: SQL (DDL y DML)
 Definición de restricciones de
clave primaria y ajena
 Ejercicios de consultas

OBJETIVOS

El objetivo de esta práctica es aprender a utilizar el lenguaje para bases de datos


SQL. Este lenguaje es el más ampliamente extendido entre los principales
productos comerciales de bases de datos. Proporciona la funcionalidades de los
tipos de lenguajes vistos en teoría:

 DDL (Lenguaje de Definición de Datos) para definir la estructura de la base


de datos y controlar el acceso a los datos
 DML (Lenguaje de Manipulación de Datos) para consultar y actualizar
datos

La práctica de hoy consistirá en crear y utilizar la base de datos de empleados de


una empresa según el ejemplo visto en las clases de teoría. Para ello, haremos uso
de la aplicación comercial de bases de datos Oracle 10 instalada en las aulas
informáticas. Aunque la mayor parte de los ejercicios están escritos en SQL
estándar, lo que posibilitaría su ejecución en cualquier otra aplicación diferente de
Oracle que siga el estándar, existen algunas partes en que se utilizan características
concretas del SQL de Oracle. Los pasos en que esto se produzca se verá indicado
con el texto NO ESTÁNDAR sobre el recuadro del ejercicio.

SQL Plus

Oracle 11 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:

Inicio > Todos los programas > Oracle - OraDb11g_home1> Desarrollo


de Aplicaciones > SQL Plus

1
Para arrancar, la herramienta nos solicitará nuestros datos de conexión 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 producirán sobre
las tablas de su propio esquema; por ello, este nombre de usuario nos
permite identificar el esquema que vamos a utilizar.
 Contraseña: Nos será proporcionada durante la práctica.
 Cadena de conexión: Identifica la instancia de Oracle a la que nos queremos
conectar. Una instancia de Oracle es una aplicación de bases de datos en
ejecución en una máquina.

CREACIÓN DE UNA TABLA

La base de datos que vamos a utilizar consta de las siguientes tablas: EMPLEADO,
DEPARTAMENTO, LOCALIZACIONES_DEPT, PROYECTO, TRABAJA_EN y
DEPENDIENTE.
Comenzaremos con un ejemplo de creación de tabla. Escribid en la consola de SQL
Plus la siguiente definición 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 bien, aparecerá el mensaje:

Tabla creada.

SQL>

La tabla Empleado ha sido creada en el sistema y ya podríamos introducir datos en


ella. Podemos consultar la descripción de la tabla con el comando DESC.

Comprueba que todo cumple con lo descrito en la sentencia de CREATE TABLE


anterior.
SQL> DESC EMPLEADO;

2
CARGA DE SCRIPTS

Tener que teclear las sentencias de manipulación de la base de datos de forma


interactiva tiene como inconveniente que cualquier error invalida toda la sentencia,
y tendríamos 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:

SQL> START "creatablas.sql"

3
 Verifica que se han creado todas las tablas. Para consultar las tablas que hay
actualmente definidas en el esquema escribe:

SQL> SELECT TABLE_NAME FROM USER_TABLES;

La relación user_tables es una vista que mantiene información 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 número de tablas creado actualmente
utilizando la función count().

INSERCIÓN DE DATOS.
TRANSACCIONES

Antes de definir las claves de las tablas vamos a insertar la información para no
tener problemas con las restricciones que imponen las claves sobre las tablas.

La razón de esto es que la definición de las claves definen además Restricciones de


Integridad Referencial que impondrían 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 razón, nunca podríamos añadir ninguna tupla a nuestras tablas).
También introduciremos el concepto de Transacción en SQL.

 Ejecuta el script datosEmpleado.sql para insertar la información de los


empleados en la tabla Empleado. Comprueba que no se produce ningún
error al cargar el script.
 Todas las actualizaciones que hemos realizado, todavía 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 sólo se realiza al finalizar una
transacción. Para finalizar la transacción actual, ejecuta:

SQL> COMMIT;

Commit complete.

4
Una transacción es un conjunto de sentencias en SQL que se ejecutan de
forma atómica; esto quiere decir, que se considera que la actualización que
producen todas las sentencias de una transacción se realiza a la vez y sin
ningún proceso externo que interrumpa dicha actualización. En Oracle por
defecto se considera una misma transacción todas las sentencias ejecutadas
entre dos COMMIT.

Puedes volver al estado que poseía la base de datos al finalizar la última


transacción con ROLLBACK. Para comprobarlo:

 Inserta de nuevo la tupla que referenciaba al empleado Juan García


 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
transacción actual.

FORMATOS DE FECHA

La introducción de fechas en Oracle permite el uso de múltiples formatos. En este


caso vamos a ver la función TO_DATE que permite formatear la fecha según sea
necesario. La forma de usar la función 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');

5
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
serán en formato español. Esto permite acortar la línea de inserción 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 también es opcional,


por lo que se puede eliminar si no se desea usar un formato de fecha extraño.

DEFINICIÓN 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
teoría para comprender las sentencias que aparecen a continuación:

 Clave primaria (PRIMARY KEY) es un campo o un conjunto de campos


de la tabla que identifican unívocamente 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 también
identifica unívocamente una tupla.

Puede haber tantas claves alternativas definidas como se quiera, pero sólo
puede haber una clave primaria en una tabla. Se puede definir con el
identificador UNIQUE.

 Clave ajena o también llamada clave externa (FOREIGN KEY) es un


campo o conjunto de campos de una tabla que referencia unívocamente 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
debería ser una clave primaria de la tabla referenciada.

6
Sigue los siguientes pasos:

1. Ejecuta las siguientes sentencias para definir las claves en las tablas:

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

2. Carga los siguientes datos. Ten en cuenta que algunas líneas poseen
información inconsistente con las restricciones impuestas por las claves
anteriormente definidas. ¿Cuál 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('Investigación',5,'333445555','22-MAY-88');
INSERT INTO DEPARTAMENTO
VALUES('Administración',4,'987654321','01-JAN-95');
INSERT INTO DEPARTAMENTO VALUES('Dirección',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('Automatización',10,'Stafford',4);
INSERT INTO PROYECTO VALUES ('Reorganización',20,'Houston',1);
INSERT INTO PROYECTO VALUES('Nuevos valores',30,'Stafford',4);

7
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);
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 restricción 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:

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

8
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 definición 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 carácter contenido en


el atributo CONSTRAINT_TYPE.

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

Estas restricciones se chequearán antes de insertar datos en la tabla, impidiendo


su actualización si no cumple sus requisitos. Si nos hemos equivocado, para
eliminar una restricción 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 restricción que queremos eliminar (en la consulta anterior, la de clave
primaria SYS_C003685699, por ejemplo).

Ejercicios

1. En Oracle la relación USER_CONSTRAINTS nos permite conocer el nombre


de una restricción (CONSTRAINT_NAME), el tipo de restricción
(CONSTRAINT_TYPE) y el nombre de la tabla sobre la que se ha definido
(TABLE_NAME).

9
Usando la relación USER_CONS_COLUMNS podemos conocer el nombre de
una restricción (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 restricción, tipo de restricción, nombre de tabla y nombre de
columna.

2. Elimina la restricción que impedía insertar la tupla anterior e insertarla.

EJERCICIOS DE CONSULTAS

Realiza las siguientes consultas:

1. Enumera los nombres de los jefes que tienen más de un familiar


dependiente. Se considera que un empleado es jefe si aparece su NSS como
NSS_SUPERV de otro empleado al menos.

Resultado de la consulta:

NOMBRE
---------------
Franklin

2. Recupera los nombres de todos los empleados que no tienen supervisores.

Resultado de la consulta:

NOMBRE APELLIDO
--------------- ---------------
James Borg

3. De cada proyecto ubicado en 'Stafford', haga una lista con el número de


proyecto, el número de departamento controlador y el apellido, dirección 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. Halla la suma de los salarios de todos los empleados del departamento de


'Investigación', así como el salario máximo, el salario mínimo y el salario
medio en dicho departamento. Debe incluirse en el cómputo el responsable
del departamento.

10
Resultado de la consulta:

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


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

5. Recupere el número de empleados del departamento 'Investigación'. Debe


incluirse en el cómputo el responsable del departamento.

Resultado de la consulta:

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

6. De cada proyecto, recupere su número, su nombre y el número 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 Automatización 1
20 Reorganización 1

7. Contar el número total de empleados en cada departamento cuyos salarios


rebasen los 10.000 € , pero sólo en el caso de departamentos en los que
trabajen más de DOS EMPLEADOS SIN CONTAR AL RESPONSABLE

Resultado de la consulta:

NOMBRED COUNT(*)
--------------- ---------
Administración 3
Investigación 4
Dirección 3

8. De cada departamento que tenga más de DOS empleados (ya que no hay
ninguno de más de 5 empleados), recupere el número de departamento y el
número de empleados que ganan más de 40.000 dólares

Resultado de la consulta:

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

11
12

También podría gustarte