Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
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%.
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 .
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.
12. Obtener todos los barcos cuya nombre sea mayor o igual que NEPTUNO.
SELECT *
FROM BARCOS
WHERE nombre >= 'NEPTUNO'
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
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
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.
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%'
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.
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 (+);
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';
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
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.
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.
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)
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)
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)