//--EXAMEN BASE DE DATOS 2DAM SEMIPRESENCIAL 2021-02-03 ALBERTO TORIBIO RUIZ
CREATE DATABASE XXXXX
GO
USE XXXXX
GO
CREATE TABLE XXXXXXXXX(
idXXXXX INT IDENTITY(1,1) PRIMARY KEY,
idXXXXXX INT FOREIGN KEY REFERENCES XXXXX(idGrupo) ON UPDATE CASCADE,
dniXXXX VARCHAR(9) FOREIGN KEY REFERENCES XXXXXX(dni) ON UPDATE CASCADE,
total INT,
Constraint "Numero entre 1 y 8" CHECK (total BETWEEN 1 AND 10),
primary key (idGrupo, dniVisitante, idXXXXX),
FOREIGN KEY(111, 222) REFERENCES XXXX(111,222),
)
GO
CREATE TABLE 2(
Fecha DATE default getdate(),
FechaHora DATETIME default getdate(),
Precio FLOAT not null,
dni CHAR(9) UNIQUE,
Nombre VARCHAR(25) not null,
Apellidos VARCHAR(30) not null,
Municipio VARCHAR(40),
matricula VARCHAR(12) UNIQUE,
stock INT default 0 CHECK (Stock >= 0),
Peso INT not null,
PesoGr AS (Peso/100)
)
GO
--INSERT. IDENTITY NO
--INSERT INTO xxxxxxx (1111,2222) VALUES(1111, 'asdasdasd')
--INSERT INTO Grupo VALUES ('23/01/2020', '15:09:00', 1)
--DATE '20200131' '17/5/2020' '2017-04-05'
/*
--1
--VIEW (hay que poner las columnas ) no se puede utilizar order by
CREATE OR ALTER VIEW vwXXXXX ("", "","")
AS
SELECT
WITH CHECK OPTION
GO
SELECT * FROM vwXXXXXX
--2
--PROCEDURE
CREATE OR ALTER PROCEDURE spXXXXX @num INT, @num2 FLOAT, @nom VARCHAR(20), @echa DATE,
AS
DECLARE @xxxx INT VARCHAR(20) FLOAT
SET @total = (SELECT * FROM )
SELECT
GO
execute spProcedimiento 99,'ASDAS';
--3
-- TRIGGER
CREATE OR ALTER TRIGGER trXXXXX ON xxxxxx FOR INSERT, UPDATE, DELETE
AS
DECLARE @xxxx INT VARCHAR(20) FLOAT DATE
DECLARE @total INT
SET @xxxx = (SELECT * FROM INSERTED/DELETED)
SET @total = (SELECT * FROM )
IF()
BEGIN
raiserror('xxxxxxx', 16,1)
rollback transaction
END
GO
--if ( (SELECT Nota FROM inserted) <> (SELECT Nota FROM deleted) )
--4
--5
*/
/*
--FUNCION (dbo.nombrefuncion para llamar)
CREATE OR ALTER FUNCTION xxxxxxx (@idAlumno INT) RETURNS varchar(50)
AS
BEGIN
DECLARE @AsignaturasSuspendidas INT
set @AsignaturasSuspendidas = (SELECT COUNT(N.Nota) FROM Alumno A INNER JOIN Nota N on A.idAlumno = N.idAlumno WHERE N.Nota < 5 AND A.idAlumno = @idAlumno)
return @asignaturasSuspendidas
END
GO
SELECT A.Nombre, dbo.AlumnosCon3Suspendidas(idAlumno) AS 'Asignaturas Suspendidas' FROM Alumno A WHERE dbo.AlumnosCon3Suspendidas(idAlumno) >= 3
-------------------------
--OTROS
--FOREIGN KEY
FOREIGN KEY (Temporada, Capitulo) REFERENCES Capitulo(Temporada, Capitulo),
PRIMARY KEY (Temporada, Capitulo)
CASCADES on update cascade on delete cascade (se pueden poner juntos
on update cascade
on delete cascade
on delete set default
on delete set null
--SELECT 'DATOS PUESTOS POR MI' "COLUMNA AÑADIDA"
--INDEX UNIQUE
--create unique index akAvionSoloVuelaUnaVez on vuelo (matriculahidro,fecha) --Para hacer que una tabla no se puedan repetir ciertos valores sin ser primary key
--CREATE UNIQUE index AK_Jamon on Jamon(idEmpresa, NumeroSerie) -- Hace que no se repita el mismo num de seria para la misma empresa
--UPDATES Usar WHERE!!
--UPDATE Alumno SET nombre= 'Jose', notamedia = (SELECT AVG(nota*1.0) FROM Nota WHERE nota.idAlumno = alumno.idAlumno) WHERE idAlumno = 1
--UPDATE alumno set idMunicipio = (select idMunicipio from municipio M where m.Nombre=alumno.Municipio)
--RETURN para hacer que pare un procedimiento/trigger y no continue
--CAST(getdate() AS DATE) // CAST(GETDATE() AS TIME)
--DATE, // '20200131' '17/5/2020' '2017-04-05'
--DATETIME YYYY-MM-DD hh:mm:ss[.nnn]
--fecha datetime default getdate() ,
--Hora TIME // '15:09:00'
--DATETIME TO DATE where cast(v.fecha as DATE)= cast (GETDATE() as DATE) --Si tenemos que pasar datetime
--DEFAULT SYSDATE
--AGGREGATE FUNCTIONS:
--SUM: Group by?
--MAX: SELECT MAX(nota) FROM Nota
--MIN: SELECT MIN(nota) FROM Nota
--COUNT Group by?
--AVG. DO A FILTER WITH HAVING
--AVG(nota*1.0)
--AVG(cast(nota as float)) // CAST(AVG(N.Nota*1.0) AS DECIMAL (5,2))
--WILDCARDS: % _ ? Like %ose
--LIKE "%ronte"
--ORDER BY ORDER BY APELLIDOS;
--DISTINCT // GROUP BY
--UNION: Left, Right, Inner IF REquests show all even if they have 0 CERO
--CONCAT SELECT CONCAT(‘p’, idProfesor) AS id, name, surname from profesore;
--SELECT (Tarifa* visitantes)
--CHECK: Constraint "Numero entre 1 y 8" CHECK (idTemporada BETWEEN 1 AND 10)
--UNIQUE: dni varchar(9) UNIQUE
--CONSTRAINT: constraint YA_EXISTE_CLAVE2 primary key (id1,id2) // Constraint "Numero entre 1 y 8" CHECK (idTemporada BETWEEN 1 AND 10)
--IS NULL: WHERE idProfesorTutor IS NULL;
--IDENTITY (1,1)// IDENTITY (30,2) --empieza en 30 y va de 2 en 2
--Comprobar si hay un nombre, id particular y que lance error si no lo hay
declare @idJamon int
set @idJamon=(select idJamon from Jamon where NumeroSerie=@numSerieJamon) -- también haría falta poner " and idEmpresa = @idEmpresa ", pero no se pidio en el enunciado
if (@idJamon is null)
begin
raiserror ('No existe este jamon' ,16,1)
return
end
OTHERS:
create table municipio
(idMunicipio int identity (38001,1) primary key, Nombre varchar(50))
TABLAS TEMPORALES
--create table #temporal
--create table ##pepe
*/
// EXAM HELP
--TRICKS
--EXAMENES
/*
--Aparcamientos: Simple tabla // con fecha y IS NULL en salida.
V Parkings con Plazas Libres
T 200 Coches Max por parking
SP Coche -> Parking en el que esta
SP Parking -> Coches en él
--Caballos Oeste: creacion tablas no clara, un caballo siempre en un establo, puede estar en película. Segun el profe en Caballo ponemos idEstablo e idPelicula
V Caballos por establo
T No superar capacidad establo
SP Caballos en establo en momento dado
SP Donde esta un caballo
--Calorias: hay que hacer función que cree las calorias, vista que cree las calorias por ingrediente en cada plato y finalmente vista con las calorias totales de cada plato o de un plato en particular
V Calorias por plato. Creo funcion para calcular las calorias de cada ingrediente en cada plato, luego vista usando la funcion que muestra los platos, sus ingredientes y sus calrias
Finalmente hago vista que suma las calorias de los ingredientes agrupando por plato
SP Calorias de un plato
T Control del máximo de calorias al poner un plato en desayuno, comida, cena
--Canyon: Grupo y visita, visitantes y guia, fecha y hora
T Personas no más de 25 + guia
SP Paises del grupo en ese intervalo Fecha y hora
V Personas que visitaron más de una vez,
--Carritos Golf Hotel: idhabitacion en cliente, e id cliente (ya que el cliente puede volver varias veces y tener distintas habitaciones), tabla carrito y alquiler
SP Nombre cliente e intervalo y nos da los carritos alquilados
V Carritos en uso actualmente o
V Carritos libres
T Impedir que un carrito sea alquilado por otro
--Croacia: tabla turistas y pasaje. 2 Maneras... id excursion o idbarco/fecha
SP Tripulacion en una fecha determinada
T No sobreparsar Tripulación y Pasajeros, 2 Triggers
V Plazas libres hoy
T Turista no puede hacer 2 excursiones al mismo tiempo
--Dispositivos: IP, Propietarios
V Dispositivos IP Fija
SP @IP - Datos de dispositivo
T Una persona maximo 3 dispositivos
V Num dispositivos por Marca
--Fotos Personales: Evento, Foto
T max 200 fotos por evento
V total fotos por evento( left join para que salgan todos los eventos)
SP @nombreEvento - Fotos de ese evento
--Helicoptero: excursion y pasaje.
T No sobrepasar capacidad y peso máximo, 2 triggers
V vuelos de hoy,
SP nombre ap pasajero y vuelos realizados,
SP piloto e intervalo fechas - vuelos realizados con cada helicopteros
--Hidroavion: Vuelo Pasaje,
T no sobrepase peso,
V pasajeros hoy
SP @matricula e intervalo @fechas- vuelos realizados
SP @fecha - vuelos no completos
--Isla Fraser 4x4: Excursion, ClientesExcursion
V Pasajeros a recoger hoy
SP @pasajeroNom - veces como cliente
T No superar capacidad
SP @fecha- cestas de comida y agua
--Jamones: columna calculada, Gramos kilos
T No dejar vender más del peso del jamón
V Cantidad Jamon vendido por dia
SP @empresa - Jamones comprados
SP @numSerie jamon - dinero conseguido vendiendolo en paquetes SELECT (@precioJamon * @pesoVendido)
--Juego Tronas
V Total capitulos por temporada
SP @actor -- datos de los capitulos
T actor maximo 10 capitulos
--Linea Cableado: Intervalo Fechas @1@2 BETWEEN
V Cantidad de instalaciones por cliente
SP @nombreMun - relacion de instalaciones
SP @intervaloFechas - cantidad de cable
T Maximo 3 instalaciones
--Munecos: Un elemento que sólo puede darse una vez, material, creamos tabla nueva. Check stock > 0
T Actualizar stock tras venta
V Cantidad ventas por muñeco
SP @color Num muñecos de ese color
--Postales Aviones
SP @compañia - relacion postales
T no mas de 20 postales con mismo modelo avion
V relacion postales aviones volando
SP Modelo avion con mas postales
--Ruta de la Tapa
T No mas 4 personas por tarjeta
V tarjetas con mas establecimientos sellados
SP @bar - total tarjetas y cantidad tapas
SP Bares que han vendido un @minimodetapas
--Top Of the Rocks: Vistas
V Grupos hoy
T No crear grupos fuera de las horas
SP @fecha dinero recaudado
--Obras: Obra, pago
T Pagos parciales no supere presupuesto
V Obras no finalizadas
SP @cliente- sus obras finalizadas
V Obras no completamente pagadas
--Sensores Arduinos: OrdenadoresConSensores Datos
V tipos de sensores grabados en el historico
T Arduino maximo 4 sensores
SP @arduino - historico de sensores
SP @nombresensor - Media de los valores de ese tipo de sensor
--Vallas Publicitarias: Facil es sin fechas, con fechas se complica
T no mas de 10 vallas al mismo tiempo por cliente
V Total vallas por cliente contratadas
SP @cliente-- vallas contratadas
V Vallas libres
--TV Cadenas
--TRIGGER
menos de: delete, update
No deje cambiar algo: Update~ se compara
--LEFT JOIN: para mostrar por ejemplo todos los juguetes y las ventas aunque no haya
*/
--VARIAS FOREIGN KEY AS PRIMARY KEY
create table vuelo
(
matricula varchar(12) foreign key references helicoptero(matricula),
fecha datetime default getdate() ,
valoracion INT,
idPiloto int foreign key references piloto(idPiloto),
primary key (Matricula,fecha),
constraint "Valoración entre 1 y 10" check (valoracion between 1 and 10),
)
go
create table Billete -- relacion vuelo pasajero.
(
matricula varchar(12),
fecha datetime ,
foreign key (matricula,fecha) references vuelo (matricula,fecha),
idPasajero varchar(15) foreign key references pasajero (idPasajero),
primary key (matricula,fecha,idPasajero)
)
go
--EN caso de que en una tabla tengamos varios foreign key que sean primary key se declaran los campos
--y luego se añaden dos lineas para el foreign key y el primary key
FOREIGN KEY (Temporada, Capitulo) REFERENCES Capitulo(Temporada, Capitulo),
PRIMARY KEY (Temporada, Capitulo)
--CONSULTAS ESPECIALES Y DIFICILES
--SUBCONSULTAS
--EXISTS / NOT EXISTS muy usado en las complejas
--IN
--ALL // ANY
--EXISTS
--IN (se usa con columna de datos, cuando se devuelven varias filas con un dato ?¿)
--EXISTS (tiene que haber una mínimo, se usa * ?¿ - Hay filas o no hay filas exists (Select * From laPepa...)
--SUBCONSULTAS EN HAVING
--GROUP BY HAVING count(*) > (....)
--WHERE por cada fila
--HAVING por cada grupo
--EL QUE MAS
--< ALL G2
/*
SELECT N.idAlumno, AVG(N.Nota) FROM Nota N
GROUP BY N.idAlumno
HAVING AVG(N.Nota) > ALL (SELECT AVG(N.Nota*1.0) FROM NOTA N GROUP BY N.idAlumno)
--TOP 1
SELECT TOP 1 AVG(Nota*1.0) FROM NOTA
GROUP BY idAlumno
ORDER BY 1 DESC;
*/
--EL QUE TIENE MAS PROCEDIMIENTO
/*
declare @maximo int
set @maximo=( select top 1 COUNT(*) from postal p
group by p.modelo
order by 1 desc)
select p.modelo "Modelo" from postal p
group by p.modelo
having COUNT(*) = @maximo
*/
--No llenos
/*
create procedure spNoEstanLlenos @fecha date
as
select matriculaHidro , piloto.nombre from vuelo
inner join piloto on (piloto.idPiloto =vuelo.idpiloto)
where fecha = @fecha
and 10 > (select COUNT(*) from pasaje
where pasaje.idVuelo = vuelo.idVuelo)
go
--3 Vista que nos de la relación de personas que han VISITA MÁS DE UNA VEZ este destino turístico.
CREATE OR ALTER VIEW vwVisitantesQueRepiten ("pasaporte", "Nombre", "Apellidos")
AS
SELECT Vis.pasaporte, Vis.Nombre, Vis.Apellidos FROM Visita V
INNER JOIN Visitante Vis ON V.pasaporte = Vis.pasaporte
GROUP BY Vis.pasaporte, Vis.Nombre, Vis.Apellidos
HAVING COUNT(V.pasaporte) > 1
GO
--Relación de alumnos del 811NMA que tiene al menos una asignatura suspendida 33 filas
SELECT * FROM Alumno A
WHERE A.idGrupo = '811NMA' AND A.idAlumno IN (SELECT N.idAlumno FROM Nota N WHERE N.Nota < 5);
SELECT * FROM Alumno A
WHERE A.idGrupo = '811NMA'
AND (SELECT count(*) FROM Nota N WHERE N.idAlumno = A.idAlumno AND Nota < 5) >=1;
SELECT * FROM Alumno A
WHERE A.idGrupo = '811NMA' AND
EXISTS (SELECT * FROM Nota N WHERE N.idAlumno = A.idAlumno AND Nota > 5)
----E6-Relación de alumnos del centro que no aprueban ninguna asignatura. 4 filas
--Nota: debe tener asignatura y nota suspendida. Los que NO tienen asignaturas no entran en la relación.
SELECT * FROM Alumno
WHERE --(NO APRUEBA NINGUNA)
--A) todas sus notas < 5 y tiene nota!!
--(not existen >= 5 y existen notas para este alumno)
NOT EXISTS (SELECT * FROM Nota WHERE Alumno.idAlumno = Nota.idAlumno AND Nota >= 5)
AND EXISTS (SELECT * FROM Nota WHERE Alumno.idAlumno = Nota.idAlumno)
FUNCIONES
--CREAR FUNCION
CREATE OR ALTER FUNCTION Calorias (@idPlato INT, @idIngrediente INT) RETURNS FLOAT
AS
BEGIN
DECLARE @CaloriasIngredientePlato FLOAT
set @CaloriasIngredientePlato = (SELECT (InP.TotalCalorias*I.CaloriasPorGr) FROM IngredientesPlato InP INNER JOIN Ingrediente I ON InP.idIngrediente = I.idIngrediente WHERE InP.idPlato = @idPlato AND I.idIngrediente = @idIngrediente)
return @CaloriasIngredientePlato
END
GO
--USAR FUNCION EN VISTA
CREATE OR ALTER VIEW vwCalorias ("Plato", "idIngrediente", "Calorias")
AS
SELECT InP.idPlato, InP.idIngrediente, dbo.Calorias(InP.idPlato, InP.idIngrediente) FROM IngredientesPlato InP
INNER JOIN Ingrediente I ON InP.idIngrediente = I.idIngrediente
GO
*/