Proyecto de Base de Datos (Parte II)

17
Proyecto de Base de Datos PARTE II Anna Vega Carrillo 74243557-V 4ºIng.Telecomunicación Diseño de Base de Datos

description

Parte II del Proyecto de Base de datos para la asignatura de Bases de Datos de la Universidad Miguel Hernández de Elche

Transcript of Proyecto de Base de Datos (Parte II)

Page 1: Proyecto de Base de Datos (Parte II)

Proyecto de Base de Datos

PARTE II

Anna Vega Carrillo74243557-V

4ºIng.TelecomunicaciónDiseño de Base de Datos

Page 2: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

Í N D I C E

PARTE II

I.IV.-Creación de los Datos....................................................................................................Página 1

Paso1.- Creación de las Tablas.....................................................................................Página 1

Paso2.- Inserción de las restricciones...........................................................................Página 2

Paso 3.- Introducción de los Datos...............................................................................Página 4

I.V.-Operaciones sobre los datos.........................................................................................Página 10

Page 3: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

PROYECTO FINAL DE DISEÑO DE BASE DE DATOS

PARTE II

En esta segunda parte de nuestro proyecto final de base de datos, nos introduciremos enOracle9i, es decir, todo nuestro diseño lo adaptaremos de modo que podamos crear nuestra base dedatos en Oracle9i. Para ello, lo primero que haremos será modificar un par de aspectos que ennuestro diseño original no se pueden implementar en Oracle9i, o si se pueden, nosotros no sabemoshacerlo.

I.IV.-Creación de los Datos

A continuación modificaremos los scripts realizados en la parte primera del proyecto, con elfin de adaptarlo a Oracle.

Paso1.- Creación de las Tablas.

La siguiente tabla contiene la información sobre las dependencias de la nave espacial. Todadependencia debe estar bajo el control de un servicio, en el caso de no asignarle ningún servicio, pordefecto una dependencia estaría bajo el control del servicio de Seguridad, cuya clave es 0101.

CREATE TABLE DEPENDENCIAS(Codigo_dep NUMBER(4,0) NOT NULL,Nombre_dep VARCHAR(15) NOT NULL,Funcion VARCHAR(15),Localizacion VARCHAR(15),Nombre_servicio VARCHAR(15) DEFAULT 'Seguridad' NOT NULL,Clave NUMBER(4,0) DEFAULT 0101 NOT NULL

);

La siguiente tabla contiene la información sobre las cámaras. Una cámara es una dependencia, demodo que el codigo_cam coincidirá con el codigo_dep de alguna dependencia. Además, cámaratiene dos campos más que son categoría y capacidad, donde almacenaremos la categoría de lacámara y la capacidad que tiene, respectivamente.

CREATE TABLE CAMARA(Codigo_cam NUMBER(4,0) NOT NULL,Categoría_cam VARCHAR(15) NOT NULL,Capacidad NUMBER(2,0) NOT NULL

);

La siguiente tabla contiene el nombre y clave que identifica a cada uno de los servicios.

CREATE TABLE SERVICIO(Nombre_servicio VARCHAR(15) NOT NULL,Clave NUMBER(4,0) NOT NULL

);

La siguiente tabla contiene la información sobre cada uno de los tripulantes, su código, su categoría,su nombre, etc.

1

Page 4: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

CREATE TABLE TRIPULACION(Codigo_trip NUMBER(4,0) NOT NULL,Categoría_trip VARCHAR(15) NOT NULL,Nombre_trip VARCHAR(20) NOT NULL,Antigüedad DATE NOT NULL,Situación_administrativa VARCHAR(15) NOT NULL,Procedencia VARCHAR(15),Codigo_dependencia_trabajar NUMBER(4,0) DEFAULT 0160 NOT NULL,Codigo_dependencia_alojar NUMBER(4,0) DEFAULT 0130 NOT NULL

);

La siguiente tabla nos determina la relación estar_asignado entre dependencias y servicios, ya quetodo servicio debe estar asignado como mínimo a una dependencia. En el caso de que a un serviciono le hubiésemos asignado ninguna dependencia, dicho servicio estaría asignado por defecto a ladependencia 0160.

CREATE TABLE ESTAR_ASIGNADO(Codigo_dep NUMBER(4,0) DEFAULT 0160 NOT NULL,Nombre_servicio VARCHAR(15) NOT NULL,Clave NUMBER(4,0) NOT NULL

);

La siguiente tabla contiene la información de los planetas.

CREATE TABLE PLANETA(Codigo_planeta VARCHAR(6) NOT NULL,Nombre_planeta VARCHAR(15) NOT NULL,Galaxia VARCHAR(15) NOT NULL,Coordenadas VARCHAR(15) NOT NULL

);

La siguiente tabla contiene la información de las razas que pueblan los planetas, ya que no puedeexistir ninguna raza que no viva en ningún planeta.

CREATE TABLE RAZA(Nombre_raza VARCHAR(15) NOT NULL,Peso NUMBER(5,2),Altura NUMBER(5,2),Anchura NUMBER(5,2)

);

La siguiente tabla contiene la información correspondiente a las visitas realizadas por cadatripulante, un tripulante puede no haber realizado ninguna visita.

CREATE TABLE VISITADO(Codigo_trip NUMBER(4,0) NOT NULL,Codigo_planeta VARCHAR(6) NOT NULL,Numero_de_visita NUMBER(2,0) NOT NULL,Tiempo_de_visita NUMBER(3,1) NOT NULL

);

La siguiente tabla corresponde con la relación estar_poblado entre planeta y raza. El campocantidad_de_individuos nos informa sobre la cantidad de individuos de esa raza en ese planeta.

CREATE TABLE ESTAR_POBLADO(Codigo_planeta VARCHAR(6) NOT NULL,Nombre_raza VARCHAR(15) NOT NULL,Cantidad_de_individuos NUMBER(20,0) NOT NULL

);

2

Page 5: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

Paso2.- Introducción de las restricciones.

Una vez creadas las tablas, modificamos el script de restricciones. En Oracle9i sólo sepermite el borrado en cascada, y el resto de opciones de borrado y modificación que hicimos en laparte primera del proyecto no las acepta. De modo que no nos dejará borrar ni modificar nada, sihace referencia algún dato de la base de datos a un determinado registro, ya que por defectoOracle9i realiza borrado y actualización restringida. Lo que supone que cada vez que queramosactualizar o borrar algún dato al que le hagan referencia otros registros, tendremos que modificarprimero el registro al cual nadie referencia, y después modificar el registro principal al que hacianreferencia los otros registros, pues al cambiarlo inicialmente en los otros registros ahora ya no hayninguno que le referencie, en ese momento Oracle9i ya nos permitirá el borrado o la actualización.Una cosa parecida a lo explicado será lo que realicemos en la última consulta.

Introducción de las restricciones de claves primarias de las tablas creadas:

ALTER TABLE DEPENDENCIASADD CONSTRAINT CLAPPAL_DEPPRIMARY KEY (Codigo_dep);

ALTER TABLE CAMARAADD CONSTRAINT CLAPPAL_CAMPRIMARY KEY(Codigo_cam);

ALTER TABLE TRIPULACIONADD CONSTRAINT CLAPPAL_TRIPPRIMARY KEY(Codigo_trip);

ALTER TABLE SERVICIOADD CONSTRAINT CLAPPAL_SERVICIOPRIMARY KEY (Nombre_servicio, Clave);

ALTER TABLE ESTAR_ASIGNADOADD CONSTRAINT CLAPPAL_ASIGNARPRIMARY KEY (Codigo_dep, Nombre_servicio, Clave);

ALTER TABLE PLANETAADD CONSTRAINT CLAPPAL_PLANETAPRIMARY KEY (Codigo_planeta);

ALTER TABLE ESTAR_POBLADOADD CONSTRAINT CLAPPAL_POBLADOPRIMARY KEY(Codigo_planeta, Nombre_raza);

ALTER TABLE RAZAADD CONSTRAINT CLAPPAL_RAZAPRIMARY KEY (Nombre_raza);

ALTER TABLE VISITADOADD CONSTRAINT CLAPPAL_VISITADOPRIMARY KEY(Codigo_trip, Codigo_planeta, Numero_de_visita);

Introducción de las restricciones de claves foráneas de las tablas creadas:

ALTER TABLE DEPENDENCIASADD CONSTRAINT CLAFOR_DEPFOREIGN KEY (Nombre_servicio,Clave) REFERENCES Servicio(Nombre_servicio, Clave);

ALTER TABLE CAMARAADD CONSTRAINT CLAFOR_CAM

3

Page 6: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

FOREIGN KEY(Codigo_cam) REFERENCES Dependencias(Codigo_dep)ON DELETE CASCADE;

ALTER TABLE TRIPULACIONADD CONSTRAINT CLAFOR_TRABAJARFOREIGN KEY (Codigo_dependencia_trabajar) REFERENCES Dependencias(Codigo_dep);

ALTER TABLE TRIPULACIONADD CONSTRAINT CLAFOR_ALOJARFOREIGN KEY (Codigo_dependencia_alojar) REFERENCES Dependencias (Codigo_dep);

ALTER TABLE ESTAR_ASIGNADOADD CONSTRAINT CLAFOR_DEPFOREIGN KEY (Codigo_dep) REFERENCES Dependencias(Codigo_dep);

ALTER TABLE ESTAR_ASIGNADOADD CONSTRAINT CLAFOR_SERVICIOCLAVEFOREIGN KEY (Nombre_servicio,Clave) REFERENCES Servicio(Nombre_servicio,Clave)ON DELETE CASCADE;

ALTER TABLE VISITADOADD CONSTRAINT CLAFOR_CODTRIPFOREIGN KEY(Codigo_trip) REFERENCES Tripulacion(Codigo_trip)ON DELETE CASCADE;

ALTER TABLE VISITADOADD CONSTRAINT CLAFOR_CODPLANETAFOREIGN KEY(Codigo_planeta) REFERENCES Planeta(Codigo_planeta);

ALTER TABLE ESTAR_POBLADOADD CONSTRAINT CLAFOR_POBLADOPLANETAFOREIGN KEY (Codigo_planeta) REFERENCES Planeta(Codigo_planeta);

ALTER TABLE ESTAR_POBLADOADD CONSTRAINT CLAFOR_POBLADORAZAFOREIGN KEY (Nombre_raza) REFERENCES Raza (Nombre_raza)ON DELETE CASCADE;

Paso3.- Introducción de los Datos.

Una vez creada toda la estructura de nuestra base de datos, nos disponemos a introducir losdatos en ella, es decir, vamos a poblar nuestra base de datos. La sintaxis SQL a utilizar es lasiguiente: INSERT INTO [Nombre de la tabla] [Nombre de los campos,...,]VALUES[Expr,...,]

Datos de la tabla Servicio:

INSERT INTO SERVICIO (Nombre_servicio,Clave) VALUES ('Seguridad',0101);INSERT INTO SERVICIO (Nombre_servicio,Clave) VALUES ('Alimentacion', 0202);INSERT INTO SERVICIO (Nombre_servicio,Clave) VALUES ('Investigacion', 0303);INSERT INTO SERVICIO (Nombre_servicio,Clave) VALUES ('Comunicacion', 0404);INSERT INTO SERVICIO (Nombre_servicio,Clave) VALUES ('Mantenimiento', 0505);INSERT INTO SERVICIO (Nombre_servicio,Clave) VALUES ('Control', 0606);INSERT INTO SERVICIO (Nombre_servicio,Clave) VALUES ('Operaciones', 0707);

Datos de la tabla Tripulacion:

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (1,

4

Page 7: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

'General', 'Pedro Picapiedra', '23-2-1992', 'Servicio', 'Tierra', 0160, 0120);

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (10,'General', 'Draco', '6-9-1994', 'Servicio', 'Tierra', 0190, 0120);

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (11,'General', 'Lyra', '4-7-1995', 'Servicio', 'Tierra', 0180, 0120);

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (2,'Militar', 'Antlia', '12-3-1995', 'Servicio', 'Tierra',0150, 0170);

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (3,'Militar', 'Hydra', '14-4-1996', 'Baja', 'Tierra',0150, 0170);

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (4,'Militar', 'Crater', '14-8-1994', 'Baja', 'Tierra', 0150, 0170);

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (5,'Militar', 'Cassiopeia', '2-6-1993', 'Servicio', 'Tierra',0160, 0170);

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (6,'Comercial','Lacerta', '4-5-1994', 'Servicio', 'Tierra',0110 ,0130 );

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (7,'Comercial','Orion', '13-7-1997', 'Baja', 'Tierra',0140, 0130);

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (8,'Comercial','Perseus', '17-4-1996', 'Servicio', 'Tierra',0140, 0130 );

INSERT INTO TRIPULACION (Codigo_trip, Categoría_trip, Nombre_trip, Antigüedad,Situación_administrativa,Procedencia, Codigo_dependencia_trabajar, Codigo_dependencia_alojar) VALUES (9,'Comercial', 'Bootes', '3-8-1993', 'Servicio', 'Tierra', 0110, 0130 );

Datos de la tabla Dependencia:

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES (0110, 'Camelopardis', 'Laboratorio', 'Norte', 'Investigacion', 0303);

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES (0120, 'Triangulum', 'Descanso', 'Este', 'Mantenimiento', 0505);

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES (0130, 'Moroceros', 'Descanso', 'Oeste', 'Mantenimiento', 0505 );

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES(0140, 'Pyxis', 'Nutricion', 'Sur', 'Alimentacion', 0202 );

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES(0150, 'Eridanus', 'Comando', 'Norte', 'Operaciones', 0707);

5

Page 8: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES(0160, 'Taurus', 'Control', 'Este', 'Mantenimiento', 0505);

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES(0170, 'Leo', 'Descanso', 'Sur', 'Mantenimiento', 0505 );

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES(0180, 'Andromedis', 'Estrategia', 'Sur', 'Control', 0606 );

INSERT INTO DEPENDENCIAS (Codigo_dep, Nombre_dep, Funcion, Localizacion, Nombre_servicio,Clave) VALUES (0190, 'Apus', 'Estrategia', 'Sur', 'Operaciones', 0707 );

Datos de la tabla Camara:

INSERT INTO CAMARA (Codigo_cam,Categoría_cam, Capacidad) VALUES (0120, 'General', 3);INSERT INTO CAMARA (Codigo_cam, Categoría_cam, Capacidad) VALUES (0130,'Comercial', 20);INSERT INTO CAMARA (Codigo_cam, Categoría_cam, Capacidad) VALUES (0170,'Militar', 15);

Datos de la tabla Estar_Asignado:

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES(0170, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES(0130, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES(0120, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES(0110, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES(0140, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES(0150, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0160, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0180, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0190, 'Seguridad',0101);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0140,'Alimentacion', 0202);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0110,'Investigacion', 0303);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0150,'Comunicacion', 0404);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0110,'Mantenimiento', 0505);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0120,'Mantenimiento', 0505);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0130,'Mantenimiento', 0505);

6

Page 9: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0140,'Mantenimiento', 0505);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0150,'Mantenimiento', 0505);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0160,'Mantenimiento', 0505);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0170,'Mantenimiento', 0505);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0180,'Mantenimiento', 0505);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0190,'Mantenimiento', 0505);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0180, 'Control',0606);

INSERT INTO ESTAR_ASIGNADO (Codigo_dep, Nombre_servicio, Clave) VALUES (0190, 'Operaciones',0707);

Datos de la tabla Planeta:

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES('MER','Mercurio', 'Via_Lactea', '32.76');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES('VEN','Venus','Via_Lactea', '456.98');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES('TIE','Tierra','Via_Lactea', '236.86');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('MAR','Marte','Via_Lactea', '275.57');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('JUP','Jupiter','Via_Lactea', '12.63');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('SAT','Saturno','Via_Lactea', '126.729');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES('URA','Urano', 'Via_Lactea', '91.250');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('NEP','Neptuno', 'Via_Lactea', '420.57');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('PLU','Pluton', 'Via_Lactea', '34.86');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('LUN01','Luna', 'Via_Lactea', '25.76');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES('TIT01','Titan', 'Via_Lactea', '47.568');

7

Page 10: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('EUR01','Europa', 'Via_Lactea', '490.74');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('GAN01','Ganimedes', 'Via_Lactea', '234.85');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES ('CAL01','Calisto', 'Via_Lactea', '13.58');

INSERT INTO PLANETA (Codigo_planeta,Nombre_planeta,Galaxia,Coordenadas) VALUES('MIM01','Mimas', 'Via_Lactea', '87.24');

Datos de la tabla Raza:

INSERT INTO RAZA (Nombre_raza, Peso, Altura, Anchura) VALUES ('Terricolas',60,1.70,100);INSERT INTO RAZA (Nombre_raza, Peso, Altura, Anchura) VALUES ('Vulcanos',68,1.80,100);INSERT INTO RAZA (Nombre_raza, Peso, Altura, Anchura) VALUES ('Serpens',75,1.65,95);INSERT INTO RAZA (Nombre_raza, Peso, Altura, Anchura) VALUES ('Canis',50,1.60,90);INSERT INTO RAZA (Nombre_raza, Peso, Altura, Anchura) VALUES ('Borealis',80,1.85,125);

Datos de la tabla Estar_Poblado:

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('TIE','Terricolas', 300);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('VEN', 'Vulcanos', 200);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('MAR', 'Terricolas', 50);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('MER', 'Serpens', 60);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('NEP', 'Canis', 80);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('URA', 'Vulcanos', 100);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('PLU', 'Serpens', 50);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('JUP', 'Canis', 500);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('SAT', 'Borealis', 200);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('MER', 'Borealis', 50);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('SAT', 'Serpens', 50);

INSERT INTO ESTAR_POBLADO (Codigo_planeta, Nombre_raza, Cantidad_de_individuos) VALUES('SAT', 'Canis', 10);

8

Page 11: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

Datos de la tabla Visitado:

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(1,'TIE',1,56);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(1,'TIE',2,72);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(1,'PLU',1,24);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'MER',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'VEN',1,45);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'TIE',1,23);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'MAR',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'JUP',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'SAT',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'URA',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'NEP',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'PLU',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'LUN01',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'TIT01',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'EUR01',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'GAN01',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'CAL01',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(2,'MIM01',1,42);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES

9

Page 12: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

(3,'VEN',1,56);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(4,'URA',1,72);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(5,'NEP',1,24);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(6,'MAR',1,8);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(7,'MER',1,36);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(8,'JUP',1,24);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(8,'EUR01',1,36);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES(9,'TIE',1,36);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES (2,'MIM01', 1, 40);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES (3,'CAL01', 1, 24);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES (4,'GAN01, 1, 36);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES (5,'EUR01', 1, 50);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES (6,'TIT01', 1, 60);

INSERT INTO VISITADO (Codigo_trip,Codigo_planeta,Numero_de_visita,Tiempo_de_visita) VALUES (7,'LUN01', 1, 50);

I.V.-Operaciones sobre los Datos

Una vez introducidos los datos, llevaremos a cabo la realización de una serie de consultasy/o operaciones sobre nuestra base de datos.

a) En la primera de ellas, deseamos saber los planetas visitados por el tripulante “PedroPicapiedra”, dando una lista con el nombre de dichos planetas, mostrando la raza que lo habita y lacantidad de individuos de esa raza en dicho planeta.

SELECT DISTINCT NOMBRE_PLANETA, NOMBRE_RAZA, CANTIDAD_DE_INDIVIDUOSFROM PLANETA LEFT JOIN ESTAR_POBLADOON PLANETA.CODIGO_PLANETA=ESTAR_POBLADO.CODIGO_PLANETAWHERE PLANETA.CODIGO_PLANETA IN (SELECT VISITADO.CODIGO_PLANETA

FROM VISITADO, TRIPULACION WHERE VISITADO.CODIGO_TRIP=TRIPULACION.CODIGO_TRIP

AND NOMBRE_TRIP='Pedro Picapiedra');

10

Page 13: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

En la subconsulta accedemos a las tablas visitado y tripulación, uniendo ambas tablas por elcódigo del tripulante, seleccionando el código de los planetas visitados por aquel tripulante cuyonombre sea Pedro Picapiedra.

Una vez realizada esta selección de planetas, seleccionamos sin duplicados, por ello elDISTINCT, ya que pueden haber realizado más de una visita al mismo planeta, y como lainformación que se desea va a ser la misma en ambas visitas, no me interesa que salgan todas lasveces que se haya visitado dicho planeta.

Unimos las tablas planeta y estar_poblado por el código del planeta, obteniendo los planetasque están poblados, pero como puede ocurrir que un planeta no esté poblado, por ello ponemos elLEFT JOIN, para que aparezcan todos los planetas, estén o no poblados.

Y por terminar elegimos todos los planetas cuyo código coincida con el código de alguno delos planetas obtenidos en la subconsulta, y de estos mostramos su código, la cantidad de individuosy el nombre de la raza que allí habita.

El resultado de la consulta es:

NOMBRE_PLANETA NOMBRE_RAZA CANTIDAD_DE_INDIVIDUOS--------------- --------------- ----------------------Pluton Serpens 50Tierra Terricolas 300

b) En esta consulta, nos piden que demos una lista de aquellas cámaras que han llegado a sucapacidad máxima.

Esta consulta se divide en dos. En la subconsulta, unimos las tablas tripulación y cámara, porel código de dependencia alojar con el código de cámara, de modo que obtenemos una lista con elcódigo de cámara donde se aloja algún tripulante, y lo agrupo en función de la capacidad de lacámara y del código de la cámara. Además sumamos todos los tripulantes que hay en cada grupoobtenido anteriormente, si dicha cantidad coincide con la capacidad de dicha cámara, quedaráseleccionado dicho código de cámara.

En la otra consulta unimos las tablas dependencia y cámara por el código de dependencia yde cámara, obteniendo de este modo sólo las dependencias que son cámara. Si el código de lascámaras obtenidas se corresponde con alguno de los códigos obtenidos en la subconsulta, meaperecerá como solución el código, nombre, la categoría y la capacidad de dichas cámaras. Estaúltima consulta tal vez no fuera necesaria hacerla, pues con la subconsulta ya tenemos las cámarasque están al aforo completo, pero como cámara la conocemos a partir de dependencias, puesto queuna cámara es una dependencia, lo hemos hecho de este modo pensando que era más correcta suimplementación.

SELECT CODIGO_DEP, NOMBRE_DEP, CATEGORÍA_CAM, CAPACIDADFROM DEPENDENCIAS JOIN CAMARAON CODIGO_DEP=CODIGO_CAMWHERE CODIGO_DEP IN (SELECT CODIGO_DEPENDENCIA_ALOJAR

FROM TRIPULACION JOIN CAMARA ON CODIGO_DEPENDENCIA_ALOJAR=CODIGO_CAM GROUP BY CODIGO_DEPENDENCIA_ALOJAR, CAPACIDAD HAVING COUNT(*)=CAPACIDAD);

11

Page 14: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

El resultado de la consulta es:

CODIGO_DEP NOMBRE_DEP CATEGORÍA_CAM CAPACIDAD---------- --------------- --------------- ---------- 120 Triangulum General 3

c) Nos piden el nombre de aquellos tripulantes que trabajen en una dependencia, cuyoservicio que la controla se llama seguridad.

En esta consulta unimos las tablas tripulación y dependencias por el código dedependencia_trabajar y el código de la dependencia, obteniendo de este modo las dependenciasdonde trabaja algún tripulante. Además exigimos que el servicio que controla a dichas dependenciasse denomine Seguridad, de modo que al unir ambas condiciones, obtenemos las dependenciascontroladas por algún servicio cuyo nombre sea Seguridad, y de aquí mostramos el nombre de lostripulantes que trabajan en dichas dependencias.

SELECT NOMBRE_TRIP FROM TRIPULACION, DEPENDENCIASWHERE CODIGO_DEPENDENCIA_TRABAJAR=CODIGO_DEP AND NOMBRE_SERVICIO='Seguridad';

El resultado de la consulta es:

Ninguna fila seleccionada.

El resultado es completamente lógico, ya que no hay ningún tripulante que trabaje en unadependencia, la cual está bajo el control de un servicio de Seguridad, puesto que los servicios deseguridad controlan las dependencias de descanso, y en estas no trabaja nadie, en estasdependencias, todos los tripulantes lo único que hacen es alojarse.

d) En esta consulta, nos piden que demos una relación de categorías de aquellos tripulantesque no han visitado los mismos planetas que “Pedro Picapiedra”.

SELECT DISTINCT CATEGORÍA_TRIP FROM TRIPULACION WHERE CODIGO_TRIP NOT IN (SELECT T1.CODIGO_TRIP FROM TRIPULACION T1

WHERE NOT EXISTS (SELECT CODIGO_PLANETA FROM VISITADO V1 JOIN TRIPULACION T2

ON V1.CODIGO_TRIP=T2.CODIGO_TRIP WHERE T2.NOMBRE_TRIP='Pedro Picapiedra' AND NOT EXISTS (SELECT * FROM VISITADO V2

WHERE V2.CODIGO_TRIP=T1.CODIGO_TRIP AND V2.CODIGO_PLANETA=V1.CODIGO_PLANETA)));

Esta consulta, a mi juicio, es la más compleja de las 5, (suponiendo que las otras las hayahecho bien, claro está). La dividimos en 4 consultas. De esta súper consulta obtendremos lacategoría de los tripulantes, sin duplicados (DISTINCT), cuyo código tripulante no esté en laprimera subconsulta.

De la primera subconsulta obtenemos el código del tripulante de la tabla tripulación, que noesté en la segunda subconsulta.

De la segunda subconsulta unimos las tablas visitado y tripulación, por el código deltripulante, obteniendo una lista con todos los tripulantes que han visitado algún planeta. Y de esta

12

Page 15: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

lista cogemos sólo aquel tripulante cuyo nombre sea Pedro Picapiedra. Pero además se debe cumplirotra condición, que es la que obtenemos de la tercera subconsulta.

La tercera subconsulta lo seleccionamos todo de la tabla visitado, obteniendo una lista contoda la información de las visitas correspondiente a los tripulantes que han realizado alguna visita, yque el código de los planetas visitados coincida con el código de los planetas visitados por PedroPicapiedra.

Recapitulando, de las 3 subconsultas obtenemos toda la información sobre los tripulantesque han visitado los mismos planetas que ha visitado Pedro Picapiedra. Y con la consulta inicial, detodos los tripulantes que han visitado planetas, quitamos a los obtenidos de las 3 subconsultas,sacando por pantalla la categoría de dichos tripulantes.

El resultado de la consulta es:

CATEGORÍA_TRIP---------------ComercialGeneralMilitar

e) En la última de las consultas, nos piden que hagamos una modificación de uno de losdatos de nuestra base de datos, y es que el planeta Europa, ha cambiado de código, a pasado de serel EUR01 a ser el UE001.

INSERT INTO PLANETA VALUES ('UE001', 'Europa', 'Via_Lactea', '490.74');

UPDATE VISITADO SET CODIGO_PLANETA='UE001' WHERE CODIGO_PLANETA='EUR01';

UPDATE ESTAR_POBLADO SET CODIGO_PLANETA='UE001' WHERE CODIGO_PLANETA='EUR01';

DELETE FROM PLANETA WHERE CODIGO_PLANETA='EUR01';

El problema que se nos plantea en esa operación, es que Oracle9i, no soporta la instrucciónUPDATE en la creación de tablas, de modo que cuando nosotros creamos las tablas con susrestricciones, no pudimos poner la opción, de que si algún dato se modifica, se actualicen todos losregistros que hagan referencia a dicho registro. Ahora, sólo podremos cambiar este dato, si no hayningún registro que le referencie. De modo que lo primero que hacemos es crearnos un nuevoregistro con los mismos datos que el planeta Europa, en la tabla Planeta, pero con el nuevo código.Después actualizamos la tabla visitado y estar_poblado, de modo que todos los registros quetuviesen como código de planeta de Europa el antiguo código, tengan el nuevo.

La sintaxis SQL es la siguiente:UPDATE TABLE [Nombre de la tabla] SET [Modificación] WHERE [Condición]Una vez actualizados estos registros, ya podemos borrar el registro del planeta Europa, en la

tabla Planeta, puesto que ya no hay ningún registro que le referencie.

El resultado de la operación es:

CODIGO_TRIP CODIGO NUMERO_DE_VISITA TIEMPO_DE_VISITA----------- ------ ---------------- ---------------- 1 TIE 1 56 1 TIE 2 72 1 PLU 1 24 2 MER 1 42

13

Page 16: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

2 VEN 1 45 2 TIE 1 23 2 MAR 1 42 2 JUP 1 42 2 SAT 1 42 2 URA 1 42 2 NEP 1 42CODIGO_TRIP CODIGO NUMERO_DE_VISITA TIEMPO_DE_VISITA----------- ------ ---------------- ---------------- 2 PLU 1 42 2 LUN01 1 42 2 TIT01 1 42 2 UE001 1 42 2 GAN01 1 42 2 CAL01 1 42 2 MIM01 1 42 3 VEN 1 56 4 URA 1 72 5 NEP 1 24 6 MAR 1 8CODIGO_TRIP CODIGO NUMERO_DE_VISITA TIEMPO_DE_VISITA----------- ------ ---------------- ---------------- 7 MER 1 36 8 JUP 1 24 8 UE001 1 36 9 TIE 1 36 3 CAL01 1 24 5 UE001 1 50 6 TIT01 1 60 7 LUN01 1 5030 filas seleccionadas.

Podemos observar que se ha actualizado la tabla visitado correctamente. La tabla estar_pobladotambién se ha actualizado correctamente, pero como no había ninguna raza que viviese allí, pues nohabía ninguna fila seleccionada.En la tabla planeta también se han modificado correctamente los datos.

A continuación mostraremos las consultas realizadas mediante operadores del álgebra relacional:

a)

b)

c)

14

Page 17: Proyecto de Base de Datos (Parte II)

Diseño de Base de Datos Proyecto Final

d)

15