Este documento describe la creación de datos para una base de datos sobre una nave espacial. Incluye la creación de tablas, restricciones y la introducción de datos. Se crean tablas para dependencias, cámaras, tripulación, servicios, planetas, razas y más. Luego se añaden restricciones de clave primaria y clave foránea. Finalmente, se introducen datos de ejemplo en las tablas.
1. Proyecto de
Base de Datos
PARTE II
Anna Vega Carrillo
74243557-V
4ºIng.Telecomunicación
Diseño de Base de Datos
2. 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
3. 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 en
Oracle9i, es decir, todo nuestro diseño lo adaptaremos de modo que podamos crear nuestra base de
datos en Oracle9i. Para ello, lo primero que haremos será modificar un par de aspectos que en
nuestro diseño original no se pueden implementar en Oracle9i, o si se pueden, nosotros no sabemos
hacerlo.
I.IV.-Creación de los Datos
A continuación modificaremos los scripts realizados en la parte primera del proyecto, con el
fin de adaptarlo a Oracle.
Paso1.- Creación de las Tablas.
La siguiente tabla contiene la información sobre las dependencias de la nave espacial. Toda
dependencia debe estar bajo el control de un servicio, en el caso de no asignarle ningún servicio, por
defecto 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, de
modo que el codigo_cam coincidirá con el codigo_dep de alguna dependencia. Además, cámara
tiene dos campos más que son categoría y capacidad, donde almacenaremos la categoría de la
cá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
4. 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 que
todo servicio debe estar asignado como mínimo a una dependencia. En el caso de que a un servicio
no le hubiésemos asignado ninguna dependencia, dicho servicio estaría asignado por defecto a la
dependencia 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 puede
existir 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 cada
tripulante, 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 campo
cantidad_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
5. 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 se
permite el borrado en cascada, y el resto de opciones de borrado y modificación que hicimos en la
parte primera del proyecto no las acepta. De modo que no nos dejará borrar ni modificar nada, si
hace referencia algún dato de la base de datos a un determinado registro, ya que por defecto
Oracle9i realiza borrado y actualización restringida. Lo que supone que cada vez que queramos
actualizar o borrar algún dato al que le hagan referencia otros registros, tendremos que modificar
primero el registro al cual nadie referencia, y después modificar el registro principal al que hacian
referencia los otros registros, pues al cambiarlo inicialmente en los otros registros ahora ya no hay
ninguno 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 DEPENDENCIAS
ADD CONSTRAINT CLAPPAL_DEP
PRIMARY KEY (Codigo_dep);
ALTER TABLE CAMARA
ADD CONSTRAINT CLAPPAL_CAM
PRIMARY KEY(Codigo_cam);
ALTER TABLE TRIPULACION
ADD CONSTRAINT CLAPPAL_TRIP
PRIMARY KEY(Codigo_trip);
ALTER TABLE SERVICIO
ADD CONSTRAINT CLAPPAL_SERVICIO
PRIMARY KEY (Nombre_servicio, Clave);
ALTER TABLE ESTAR_ASIGNADO
ADD CONSTRAINT CLAPPAL_ASIGNAR
PRIMARY KEY (Codigo_dep, Nombre_servicio, Clave);
ALTER TABLE PLANETA
ADD CONSTRAINT CLAPPAL_PLANETA
PRIMARY KEY (Codigo_planeta);
ALTER TABLE ESTAR_POBLADO
ADD CONSTRAINT CLAPPAL_POBLADO
PRIMARY KEY(Codigo_planeta, Nombre_raza);
ALTER TABLE RAZA
ADD CONSTRAINT CLAPPAL_RAZA
PRIMARY KEY (Nombre_raza);
ALTER TABLE VISITADO
ADD CONSTRAINT CLAPPAL_VISITADO
PRIMARY KEY(Codigo_trip, Codigo_planeta, Numero_de_visita);
Introducción de las restricciones de claves foráneas de las tablas creadas:
ALTER TABLE DEPENDENCIAS
ADD CONSTRAINT CLAFOR_DEP
FOREIGN KEY (Nombre_servicio,Clave) REFERENCES Servicio(Nombre_servicio, Clave);
ALTER TABLE CAMARA
ADD CONSTRAINT CLAFOR_CAM
3
6. Diseño de Base de Datos Proyecto Final
FOREIGN KEY(Codigo_cam) REFERENCES Dependencias(Codigo_dep)
ON DELETE CASCADE;
ALTER TABLE TRIPULACION
ADD CONSTRAINT CLAFOR_TRABAJAR
FOREIGN KEY (Codigo_dependencia_trabajar) REFERENCES Dependencias(Codigo_dep);
ALTER TABLE TRIPULACION
ADD CONSTRAINT CLAFOR_ALOJAR
FOREIGN KEY (Codigo_dependencia_alojar) REFERENCES Dependencias (Codigo_dep);
ALTER TABLE ESTAR_ASIGNADO
ADD CONSTRAINT CLAFOR_DEP
FOREIGN KEY (Codigo_dep) REFERENCES Dependencias(Codigo_dep);
ALTER TABLE ESTAR_ASIGNADO
ADD CONSTRAINT CLAFOR_SERVICIOCLAVE
FOREIGN KEY (Nombre_servicio,Clave) REFERENCES Servicio(Nombre_servicio,Clave)
ON DELETE CASCADE;
ALTER TABLE VISITADO
ADD CONSTRAINT CLAFOR_CODTRIP
FOREIGN KEY(Codigo_trip) REFERENCES Tripulacion(Codigo_trip)
ON DELETE CASCADE;
ALTER TABLE VISITADO
ADD CONSTRAINT CLAFOR_CODPLANETA
FOREIGN KEY(Codigo_planeta) REFERENCES Planeta(Codigo_planeta);
ALTER TABLE ESTAR_POBLADO
ADD CONSTRAINT CLAFOR_POBLADOPLANETA
FOREIGN KEY (Codigo_planeta) REFERENCES Planeta(Codigo_planeta);
ALTER TABLE ESTAR_POBLADO
ADD CONSTRAINT CLAFOR_POBLADORAZA
FOREIGN 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 los
datos en ella, es decir, vamos a poblar nuestra base de datos. La sintaxis SQL a utilizar es la
siguiente: 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
8. 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
9. 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
10. 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
11. 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
12. 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 consultas
y/o operaciones sobre nuestra base de datos.
a) En la primera de ellas, deseamos saber los planetas visitados por el tripulante “Pedro
Picapiedra”, dando una lista con el nombre de dichos planetas, mostrando la raza que lo habita y la
cantidad de individuos de esa raza en dicho planeta.
SELECT DISTINCT NOMBRE_PLANETA, NOMBRE_RAZA, CANTIDAD_DE_INDIVIDUOS
FROM PLANETA LEFT JOIN ESTAR_POBLADO
ON PLANETA.CODIGO_PLANETA=ESTAR_POBLADO.CODIGO_PLANETA
WHERE PLANETA.CODIGO_PLANETA IN (SELECT VISITADO.CODIGO_PLANETA
FROM VISITADO, TRIPULACION
WHERE VISITADO.CODIGO_TRIP=TRIPULACION.CODIGO_TRIP
AND NOMBRE_TRIP='Pedro Picapiedra');
10
13. Diseño de Base de Datos Proyecto Final
En la subconsulta accedemos a las tablas visitado y tripulación, uniendo ambas tablas por el
código del tripulante, seleccionando el código de los planetas visitados por aquel tripulante cuyo
nombre sea Pedro Picapiedra.
Una vez realizada esta selección de planetas, seleccionamos sin duplicados, por ello el
DISTINCT, ya que pueden haber realizado más de una visita al mismo planeta, y como la
información que se desea va a ser la misma en ambas visitas, no me interesa que salgan todas las
veces que se haya visitado dicho planeta.
Unimos las tablas planeta y estar_poblado por el código del planeta, obteniendo los planetas
que están poblados, pero como puede ocurrir que un planeta no esté poblado, por ello ponemos el
LEFT 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 de
los planetas obtenidos en la subconsulta, y de estos mostramos su código, la cantidad de individuos
y el nombre de la raza que allí habita.
El resultado de la consulta es:
NOMBRE_PLANETA NOMBRE_RAZA CANTIDAD_DE_INDIVIDUOS
--------------- --------------- ----------------------
Pluton Serpens 50
Tierra Terricolas 300
b) En esta consulta, nos piden que demos una lista de aquellas cámaras que han llegado a su
capacidad máxima.
Esta consulta se divide en dos. En la subconsulta, unimos las tablas tripulación y cámara, por
el código de dependencia alojar con el código de cámara, de modo que obtenemos una lista con el
código de cámara donde se aloja algún tripulante, y lo agrupo en función de la capacidad de la
cámara y del código de la cámara. Además sumamos todos los tripulantes que hay en cada grupo
obtenido 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 y
de cámara, obteniendo de este modo sólo las dependencias que son cámara. Si el código de las
cámaras obtenidas se corresponde con alguno de los códigos obtenidos en la subconsulta, me
aperecerá 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ámaras
que están al aforo completo, pero como cámara la conocemos a partir de dependencias, puesto que
una cámara es una dependencia, lo hemos hecho de este modo pensando que era más correcta su
implementación.
SELECT CODIGO_DEP, NOMBRE_DEP, CATEGORÍA_CAM, CAPACIDAD
FROM DEPENDENCIAS JOIN CAMARA
ON CODIGO_DEP=CODIGO_CAM
WHERE 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
14. 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, cuyo
servicio que la controla se llama seguridad.
En esta consulta unimos las tablas tripulación y dependencias por el código de
dependencia_trabajar y el código de la dependencia, obteniendo de este modo las dependencias
donde trabaja algún tripulante. Además exigimos que el servicio que controla a dichas dependencias
se denomine Seguridad, de modo que al unir ambas condiciones, obtenemos las dependencias
controladas por algún servicio cuyo nombre sea Seguridad, y de aquí mostramos el nombre de los
tripulantes que trabajan en dichas dependencias.
SELECT NOMBRE_TRIP
FROM TRIPULACION, DEPENDENCIAS
WHERE 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 una
dependencia, la cual está bajo el control de un servicio de Seguridad, puesto que los servicios de
seguridad controlan las dependencias de descanso, y en estas no trabaja nadie, en estas
dependencias, 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 tripulantes
que 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 haya
hecho bien, claro está). La dividimos en 4 consultas. De esta súper consulta obtendremos la
categoría de los tripulantes, sin duplicados (DISTINCT), cuyo código tripulante no esté en la
primera subconsulta.
De la primera subconsulta obtenemos el código del tripulante de la tabla tripulación, que no
esté en la segunda subconsulta.
De la segunda subconsulta unimos las tablas visitado y tripulación, por el código del
tripulante, obteniendo una lista con todos los tripulantes que han visitado algún planeta. Y de esta
12
15. Diseño de Base de Datos Proyecto Final
lista cogemos sólo aquel tripulante cuyo nombre sea Pedro Picapiedra. Pero además se debe cumplir
otra condición, que es la que obtenemos de la tercera subconsulta.
La tercera subconsulta lo seleccionamos todo de la tabla visitado, obteniendo una lista con
toda la información de las visitas correspondiente a los tripulantes que han realizado alguna visita, y
que el código de los planetas visitados coincida con el código de los planetas visitados por Pedro
Picapiedra.
Recapitulando, de las 3 subconsultas obtenemos toda la información sobre los tripulantes
que han visitado los mismos planetas que ha visitado Pedro Picapiedra. Y con la consulta inicial, de
todos 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
---------------
Comercial
General
Militar
e) En la última de las consultas, nos piden que hagamos una modificación de uno de los
datos de nuestra base de datos, y es que el planeta Europa, ha cambiado de código, a pasado de ser
el 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ón
UPDATE en la creación de tablas, de modo que cuando nosotros creamos las tablas con sus
restricciones, no pudimos poner la opción, de que si algún dato se modifica, se actualicen todos los
registros que hagan referencia a dicho registro. Ahora, sólo podremos cambiar este dato, si no hay
ningún registro que le referencie. De modo que lo primero que hacemos es crearnos un nuevo
registro 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 que
tuviesen 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
16. 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 42
CODIGO_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 8
CODIGO_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 50
30 filas seleccionadas.
Podemos observar que se ha actualizado la tabla visitado correctamente. La tabla estar_poblado
también se ha actualizado correctamente, pero como no había ninguna raza que viviese allí, pues no
habí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