Construcción
Falta para nuestra inaguración:
01/11/2025 12:00 AM

MySQL
MISSION (Codigo, tipo, sistema, lugar, peligrosidad, exito)
REBELDE (Nombre, sistema, lugar)
HACE (cod_mision, nom_rebelde)
      cod_mision es FK a Codigo de MISSION
      nom_rebelde es FK a Nombre de REBELDE
JEDI (Nombre_jedi, nivel_fuerza)
      Nombre es FK a Nombre de REBELDE
PILOTO (Nombre_piloto, nave_espacial)
      Nombre es FK a Nombre de REBELDE
Esquema ejercicio

1) Mostrar todos los datos de las misiones con una peligrosidad superior a la media:

SELECT * FROM Mission WHERE peligrosidad > 
       (SELECT AVG(peligrosidad) FROM Mission);

2) Mostrar el nombre del jedi con un nivel de fuerza superior al resto:

SELECT nom_pilot
FROM Pilot 
WHERE nau_espacial=
		(
		SELECT t.nau_espacial
		FROM (
			SELECT TOP 1 COUNT(*) AS num_pilotos, nau_espacial
			FROM Pilot 
			GROUP BY nau_espacial
			ORDER BY num_pilotos DESC
			) AS t
	);

3) Mostrar los nombres de los piltotos que pilotan la nave espacial que más pilotos pilotan:





4) Se quiere saber para cada sistema, cuantos jedais y cuantos pilotos hay:

SELECT *
FROM
	(SELECT r.sistema, COUNT(j.Nombre_jedi) AS Num_Jedi
	FROM Rebelde r 
	JOIN Jedi j ON r.Nombre = j.Nombre_jedi 
	GROUP BY r.sistema) AS Una
FULL OUTER JOIN
	(SELECT r.sistema, COUNT(p.Nombre_piloto) AS Num_Pilot
	FROM Rebelde r 
	JOIN Piloto p ON r.Nombre = p.Nombre_pilot 
	GROUP BY r.sistema) AS Dos
ON Una.sistema=Dos.sistema

5) Mostrar todos los datos del jedi que más misiones con éxito haya acabado:

SELECT *
FROM Jedi j
JOIN Rebelde r ON j.Nombre_jedi=r.Nombre
WHERE j.Nombre_jedi=
		(
			SELECT t.Nombre_jedi
			FROM (
				SELECT TOP 1 COUNT(j.Nombre_jedi) AS Misiones_Exito, j.Nombre_jedi
				FROM Jedi j
				JOIN FA ON j.Nombre_jedi=FA.Nombre_rebel
				JOIN Mission m ON FA.codi_mision=m.Codigo
				WHERE m.exito = 'True'
				GROUP BY j.Nombre_jedi
				ORDER BY Misiones_Exito DESC
			) AS t
		);

6) Mostrar para cada misión pendiente de realitzarse (exito = null) que rebeldes estan en el mismo sistema y lugar que la misión:

SELECT *
FROM Mission m
JOIN FA ON m.Codigo=FA.cod_mision
JOIN Rebelde r ON FA.nom_rebelde=r.Nombre
WHERE m.exito IS NULL 
      AND m.sistema=r.sistema 
      AND m.lugar=r.lugar

7) Mostrar todos los datos de las misiones con una peligrosidad inferior a la media, que hayan estado realizadas por mas de dos rebeldes:

SELECT *
FROM Mission
JOIN 
		(
		SELECT mi.codigo
		FROM
			(
				SELECT m.codigo, COUNT(FA.nombre_rebelde) numero_rebelde
				FROM Mission m
				JOIN FA ON m.codigo=FA.codigo_mision
				WHERE m.peligrosidad < (SELECT AVG(m.peligrosidad) FROM Mission m)
				GROUP BY m.codigo
			) mi
		WHERE mi.numero_rebelde>2
		) codigo_mp
ON Mission.codigo=codigo_mp.codigo

8) Hay rebeldes que no són ni pilotos ni jedis, però que tienen una gran importancia para la resistencia. Hay que mostrar todos los datos de estos rebeldes, así como las de los rebeldes que esten en su misma localización (sistema i lugar)

(
	SELECT *, 'Rebelde sin rol' AS tipo
	FROM Rebelde r 
	WHERE Not r.nombre In (SELECT j.nombre_jedi FROM Jedi j) 
        AND Not r.nombre In (SELECT p.nombre_piloto FROM piloto p)
)
UNION 
(
	SELECT r.nombre, r.sistema, r.lugar, 'Jedi o Piloto' AS tipo
	FROM Rebelde r 
	JOIN (
		SELECT *
		FROM Rebelde r 
		WHERE Not r.nombre In (SELECT j.nombre_jedi FROM Jedi j) 
			AND Not r.nombre In (SELECT p.nombre_piloto FROM piloto p)
		) sin_rol
	ON r.lugar=sin_rol.lugar AND r.sistema=sin_rol.sistema
)
ORDER BY tipo DESC

9) El nivel de fuerza de un jedi aumenta en función de las misiones que realiza con éxito. Para cada misión con peligrosidad 10 realizada con éxito donde haya participado, el nivel de fuerza del jedi aumenta en un punt. Actualiza la base de datos con esta información:

UPDATE Jedi 
SET nivell_forsa = nivell_forsa + 1 
WHERE nom_jedi IN
	(
	SELECT j.nom_jedi 
	FROM Mision m 
	JOIN FA f ON m.codi=f.codi_missio AND m.te_exit= 'True' AND perillositat=10
	JOIN Jedi j ON f.nom_rebel=j.nom_jedi
	)

10) El lugar más peligroso del universo para un rebelde és aquel en que se han realizado más misiones sin éxito. Hay que hacer una consulta para mostrar cual és este lugar (sistema y lugar).

SELECT TOP 1 COUNT(*) AS num_misiones_fallidas, m.sistema, m.lloc 
	FROM Missio m 
	WHERE m.te_exit= 'False'
	GROUP BY m.sistema, m.lloc
ORDER BY num_misiones_fallidas DESC

11) Crear un TRIGGER que en caso de que se cree una nueva misión se asigne los rebeldes que no estan en ninguna misión en este momento.

- Realizamos el insert
-- INSERT INTO Missio (codi, tipus, sistema, lloc, perillositat)
-- VALUES ('14','GKU','Alpha','Satelite',5);

-- Función que devuelve los reveldes que no están asignados a ninguna misión
CREATE FUNCTION dbo.reveldes_sin_mision()
	RETURNS table
AS
RETURN (SELECT r.nom
		FROM Rebel r 
		WHERE r.nom NOT IN
			-- Rebels que tenen missió asignada
			(
			SELECT r.nom
			FROM FA f
			JOIN Rebel r ON f.nom_rebel=r.nom
			GROUP BY r.nom
			)
		)

-- ######### TRIGGER #########################################
---SELECT * FROM reveldes_sin_mision()
CREATE TRIGGER dbo.asignar_rebels
	ON dbo.Missio
AFTER INSERT
AS
BEGIN
	SET NOCOUNT ON;
	-- Recibir codigo de la misión nueva
	DECLARE @Codi_Misio VARCHAR(50);
	SELECT @Codi_Misio = INSERTED.codi
	FROM INSERTED
	
	-- Rebeldes que no tienen misión asignada
	--DECLARE @ReveldesLibres TABLE (nom varchar(50));
	@ReveldesLibres = SELECT COUNT(*) FROM reveldes_sin_mision();

	-- BUCLE para todos los reveldes
		DECLARE @Puntero INT = 0;
		WHILE (@Puntero < @ReveldesLibres )
		BEGIN
			INSERT INTO FA (codi_missio, nom_rebel)
			VALUES ( @Codi_Misio, XXXXXXXXXXXXXXX)
			SET @Puntero = @Puntero + 1;
		END
END
GO

Deja una respuesta