Está en la página 1de 8

U.D. 4 Boletín 1 Solución. SQL. 1º ASIR. GBD.

2022-2023

1. Ejecutar en la base de datos el script SQL sc_bol1.sql suministrado junto con el ejercicio.
Podéis utilizar SQLPlus o SQL Developer.

Este script crea, para el usuario con el cual lo ejecutemos, el esquema relacional de un pequeño
problema de bases de datos. También inserta algunas filas de ejemplo para que podamos
practicar con sentencias de consulta de datos de SQL. Las tablas creadas son las siguientes:

TIPOS_BARCO (codtipo, descripcion, numarmas, desplazamiento);


BARCOS (codbarco, nombre, pais, codtipo, fechabotadura, codjefeesc);
BATALLAS (codbatalla, nombre, fecha);
RESULTADOS (codbarco, codbatalla, pctperdidas);
Para no crear estas tablas en el usuario SYSTEM o SYS (nada recomendable) o en el usuario
HR podemos crear previamente un nuevo usuario o esquema en la base de datos desde el que
ejecutaremos el script. Podemos crear el usuario EJERCICIOS al que nos aseguraremos de darle
los roles y privilegios adecuados. (nombre de usuario en mayúsculas)
Roles debe tener al menos: CONNECT y RESOURCE
Privilegios: CREATE SESSION, CREATE SYNONYM, CREATE TABLE, CREATE
SEQUENCE, CREATE PROCEDURE, CREATE VIEW, UNLIMITED TABLESPACE
2. Observad el resultado de la ejecución del script. Estudiad las tablas que se han creado junto con
sus restricciones y los tipos de datos de sus columnas. Dibujad el diagrama entidad relación
asociado al esquema relacional.
3. Obtener el nombre, país y fecha de la botadura de todos los barcos de la base de datos.
SELECT nombre, pais, fechabotadura
FROM BARCOS
4. Obtener toda la información de todos los tipos de barcos.
SELECT *
FROM TIPOS_BARCO
5. Recuperar todas las filas de la tabla batallas renombrando la columna codbatalla como Código
de la batalla y fecha como Fecha de la batalla.

SELECT codbatalla “Código de la batalla”, fecha “Fecha de la batalla”


FROM BATALLAS

6. Obtener todos los códigos de tipo de barco que pueden existir en nuestra base de datos.

SELECT codtipo
FROM TIPOS_BARCO

7. Obtener, para todos los tipos de barco de nuestra base de datos, la descripción y el campo
número de armas, este último incrementado en un 50%.

SELECT region, numarmas*1.5


FROM TIPOS_BARCO

MLLS. Dpto. Informática. IES San Sebastián Página 1 de 8


U.D. 4 Boletín 1 Solución. SQL. 1º ASIR. GBD. 2022-2023

8. Obtener una lista de todas las batallas de la base de datos donde cada batalla se presente de la
siguiente forma: La batalla de código XXX tuvo lugar en la fecha XX-XX-XXXX
SELECT 'La batalla de código ' || codbatalla || ' tuvo lugar en la fecha ' ||
TO_CHAR(fecha,'dd-mm-yyyy') "Información de batallas"
FROM BATALLAS
9. Obtener cuáles son los códigos de tipo de barco para los que existe algún barco en nuestra base
de datos .

SELECT DISTINCT codtipo


FROM BARCO

10. Obtener cuáles son los códigos de tipo de barco junto con el país de procedencia para los que
existe algún barco en nuestra base de datos.

SELECT DISTINCT codtipo, pais FROM BARCOS;


11. Obtener los tipos de barco cuyo número de armas sea superior a 30.

SELECT * FROM TIPOS_BARCO


WHERE numarmas >= 30

12. Obtener todos los barcos cuya nombre sea mayor o igual que NEPTUNO.

SELECT *
FROM BARCOS
WHERE nombre >= 'NEPTUNO'

13. Obtener la fecha de las batallas realizadas antes del 1-3-1770.

SELECT fecha
FROM BATALLAS
WHERE fecha < TO_DATE('01-03-1770', 'dd-mm-yyyy')
14. Obtener los nombres y países de origen de aquellos barcos que sean de tipo 1 y de nombre
menor a NEPTUNO

SELECT nombre, pais


FROM BARCOS
WHERE codtipo=1 AND nombre < 'NEPTUNO'

15. Obtener toda la información de los tipos de barcos que desplacen menos de 2000 toneladas o
tengan más de 60 armas.

SELECT *
FROM TIPOS_BARCO
WHERE desplazamiento<2000 OR numarmas>60

MLLS. Dpto. Informática. IES San Sebastián Página 2 de 8


U.D. 4 Boletín 1 Solución. SQL. 1º ASIR. GBD. 2022-2023

16. Obtener aquellos barcos que sean de INGLATERRA o de FRANCIA y cuyo tipo sea el 3.

SELECT *
FROM BARCOS
WHERE codtipo=3 AND (pais='INGLATERRA' OR pais='FRANCIA'
17. Obtener aquellas batallas que tuvieron entre el 1-1-1780 y 31-12-1799.

SELECT codbatalla, nombre, TO_CHAR(fecha, 'dd-mm-yyyy') Fecha


FROM BATALLAS
WHERE fecha BETWEEN '1-1-1780' AND '31-12-1799'

18. Obtener todos aquellos barcos que sean del tipo 1,3,5 ó 7.
SELECT *
FROM BARCOS
WHERE codtipo IN (1,3,5,7)

19. Obtener todos aquellas batallas que tengan la fecha de realización a NULL.
SELECT *
FROM BATALLAS
WHERE fecha IS NULL

20. Obtener todos aquellas batallas que tengan la fecha de realización a no NULL y cuyo nombre
esté entre CABO y LUGO.
SELECT *
FROM BATALLAS
WHERE fecha IS NOT NULL AND nombre BETWEEN 'CABO' AND 'LUGO'

21. Obtener todos los nombres de los barcos que comiencen por B y que contengan el carácter
subrayado en el mismo.
SELECT *
FROM BARCOS
WHERE NOMBRE LIKE 'B%$_%' ESCAPE '$'

22. Obtener todos los nombres de los barcos para los que el nombre tenga una A como segundo
carácter.
SELECT *
FROM BARCOS
WHERE NOMBRE LIKE '_A%'

MLLS. Dpto. Informática. IES San Sebastián Página 3 de 8


U.D. 4 Boletín 1 Solución. SQL. 1º ASIR. GBD. 2022-2023

23. Hallar el producto cartesiano de las tablas TIPOS_BARCO y BARCOS. Estudiar el resultado
de esa consulta. ¿Por qué produce ese número tan alto de filas?.

SELECT *
FROM TIPOS_BARCOS, BARCOS

24. Obtener una lista con los códigos de los barcos, su nombre y la descripción del tipo de barco al
que pertenece.

SELECT codbarco, nombre, BARCOS.codtipo, descripcion


FROM TIPOS_BARCO, BARCOS
WHERE TIPOS_BARCO.codtipo = BARCOS.codtipo
25. Obtener la lista de los barcos ingleses, reflejando su código de barco, nombre, código de tipo y
descripción del tipo de barco
SELECT codbarco, nombre, BARCOS.codtipo, descripcion
FROM TIPOS_BARCO, BARCOS
WHERE TIPOS_BARCO.codtipo = BARCOS.codtipo AND
pais='INGLATERRA'

26. Obtener la lista de los barcos dañados en alguna batalla, mostrando para cada barco su código,
nombre, país y porcentaje de daños sufridos.
SELECT BARCOS.codbarco, nombre, pais, pctperdidas
FROM BARCOS, RESULTADOS
WHERE BARCOS.codbarco = RESULTADOS.codbarco

27. Obtener un listado del nombre de cada barco junto con el de su jefe de escuadra.
SELECT B1.nombre "Barco", B2.nombre "Jefe Escuadra"
FROM BARCOS B1, BARCOS B2
WHERE B1.codjefesc = B2.codbarco

28. Obtener un listado de los tipos de barcos existentes junto con todos los barcos que existan para
ese tipo. Deben aparecer las columnas código de tipo, descripción, código de barco, nombre de
barco y país. Si no existen barcos para el tipo de barco mostrar únicamente la información del
tipo.
SELECT T.codtipo, descripcion, codbarco, nombre, pais
FROM TIPOS_BARCO T, BARCOS B
WHERE T .codtipo = B.codtipo (+);

MLLS. Dpto. Informática. IES San Sebastián Página 4 de 8


U.D. 4 Boletín 1 Solución. SQL. 1º ASIR. GBD. 2022-2023

29. Obtener el nombre, el país y la fecha de botadura de todos los barcos que participaron en la
batalla de TENERIFE.
SELECT B.nombre, pais, fechabotadura
FROM BARCOS B, BATALLAS L, RESULTADOS R
WHERE B.codbarco = R.codbarco AND R.codbatalla = L.codbatalla AND
L.nombre = 'TENERIFE';

30. Obtener las batallas en las que participaron barcos de la clase FRAGATA.
SELECT DISTINCT L.codbatalla, L.nombre, fecha
FROM TIPOS_BARCO T, BARCOS B, BATALLAS L, RESULTADOS R
WHERE B.codbarco=R.codbarco AND R.codbatalla=L.codbatalla
AND B.codtipo=T.codtipo AND T.descripcion='FRAGATA';

31. Obtener los barcos con desplazamiento superior a 3000 toneladas.


SELECT B.*
FROM BARCOS B, TIPOS_BARCO T
WHERE B.codtipo=T.codtipo AND desplazamiento > 3000

32. Obtener el número de barcos de cada tipo que existen en nuestra base de datos.
SELECT codtipo, count(codtipo)
FROM BARCOS
GROUP BY codtipo

33. Obtener el número de tipos de barcos que existen en nuestra base de datos.
SELECT count(codtipo)
FROM TIPOS_BARCO

34. Obtener para cada país la fecha de botadura de barco más baja y la más alta.
SELECT pais, min(fechabotadura), max(fechabotadura)
FROM BARCOS
GROUP BY pais

35. Obtener la fecha en la que se botó el barco más antiguo de nuestra base de datos.
SELECT min(fechabotadura)
FROM BARCOS

MLLS. Dpto. Informática. IES San Sebastián Página 5 de 8


U.D. 4 Boletín 1 Solución. SQL. 1º ASIR. GBD. 2022-2023

36. Obtener el número de barcos de cada tipo que existen clasificados por país y descripción de
tipo.
SELECT pais, descripcion, count(*)
FROM BARCOS B, TIPOS_BARCO T
WHERE B.codtipo = T.codtipo
GROUP BY pais, descripcion

37. Obtener un listado con el código de batalla, nombre de la batalla y el número de barcos que
participaron en ella.
SELECT B.codbatalla, count(R.codbarco) NumBarcos
FROM BATALLAS B, RESULTADOS R
WHERE B.codbatalla = R.codbatalla
GROUP BY B.codbatalla

38. Obtener los barcos que resultaron dañados en al menos dos batallas.
SELECT B.codbarco, count(B.codbarco)
FROM BARCOS B, RESULTADOS L
WHERE B.codbarco = L.codbarco AND pctperdidas>0
GROUP BY B.codbarco
HAVING count(B.codbarco) > 1

39. Obtener las batallas en las que participaron al menos tres barcos del mismo país.

SELECT DISTINCT CODBATALLA


FROM BATALLAS
JOIN RESULTADOS USING (codbatalla)
JOIN BARCOS USING(CODBARCO)
GROUP BY CODBATALLA, PAIS
HAVING COUNT(CODBARCO)>=3;

40. Obtener los nombres de las clases de barcos tales que al menos un barco de la clase se hundió
en una batalla.

SELECT descripcion
FROM RESULTADOS
JOIN BARCOS USING(CODBARCO)
JOIN TIPOS_BARCO USING(codtipo)
WHERE PCTPERDIDAS=1
GROUP BY CODTIPO, DESCRIPCION

41. Para cada clase, encontrar el año en el que fue botado el barco más antiguo de la clase.

SELECT CODTIPO, DESCRIPCION,


EXTRACT (YEAR FROM (MIN(FECHABOTADURA)))
FROM BARCOS
JOIN TIPOS_BARCO USING(codtipo)
GROUP BY CODTIPO, DESCRIPCION

MLLS. Dpto. Informática. IES San Sebastián Página 6 de 8


U.D. 4 Boletín 1 Solución. SQL. 1º ASIR. GBD. 2022-2023

42. ¿Qué barcos son del mismo país que el barco NEPTUNO?.
SELECT *
FROM BARCOS
WHERE pais = (SELECT pais
FROM BARCOS WHERE nombre = 'NEPTUNO')

43. Visualizar las batallas que se hayan librado después de la batalla de LUCON pero antes de
1800.
SELECT *
FROM BATALLAS
WHERE fecha < '1-1-1800' AND
fecha > (SELECT fecha
FROM BATALLAS
WHERE nombre = 'LUCON')

44. Visualizar el código de barco, nombre y país de todos los barcos cuya fecha de botadura sea
máxima.
SELECT codbarco, nombre, pais
FROM BARCOS
WHERE fechabotadura =(SELECT max(fechabotadura)
FROM BARCOS)

45. Visualizar aquellos países que poseen menos barcos que INGLATERRA.
SELECT pais
FROM BARCOS
GROUP BY pais
HAVING COUNT(codbarco) <(SELECT COUNT(codbarco)
FROM BARCOS
WHERE pais='INGLATERRA')

46. Obtener la lista de todos los barcos que desplacen más toneladas que la media de
desplazamiento de los barcos su país.
SELECT B.nombre, desplazamiento
FROM BARCOS B, TIPOS_BARCO T
WHERE B.codtipo = T.codtipo
AND desplazamiento > (SELECT AVG(desplazamiento)
FROM BARCOS B1, TIPOS_BARCO T1
WHERE B1.codtipo = T1.codtipo AND B1.pais=B.pais)

MLLS. Dpto. Informática. IES San Sebastián Página 7 de 8


U.D. 4 Boletín 1 Solución. SQL. 1º ASIR. GBD. 2022-2023

47. Obtener la lista de todos los códigos de barcos de aquellos barcos que son jefe de escuadra.
SELECT DISTINCT codjefesc
FROM BARCOS

48. Obtener la lista de todas las batallas en las que haya participado algún barco jefe de escuadra.
SELECT B.codbatalla, B.nombre
FROM BATALLAS B, RESULTADOS R
WHERE b.codbatalla = r.codbatalla and r.codbarco IN (SELECT DISTINCT
codjefesc FROM BARCOS)

49. Obtener los barcos que no hayan participado en ninguna batalla.


SELECT *
FROM BARCOS
WHERE codbarco!=ALL(SELECT codbarco FROM resultados)

50. Obtener los tipos de barco para los que existen barcos en la base de datos.
SELECT *
FROM TIPOS_BARCO T
WHERE EXISTS (SELECT DISTINCT codtipo
FROM BARCOS B
WHERE T.codtipo=B.codtipo)

51. Obtener la unión de todos los barcos ingleses que han participado en alguna batalla y de todos
los barcos franceses que no han participado en ninguna batalla.
SELECT DISTINCT B.*
FROM BARCOS B, RESULTADOS R
WHERE B.codbarco = R.codbarco AND pais='INGLATERRA'

UNION

SELECT *
FROM BARCOS
WHERE pais='FRANCIA' AND codbarco!=ALL(SELECT codbarco FROM resultados)

MLLS. Dpto. Informática. IES San Sebastián Página 8 de 8

También podría gustarte