Basi di dati: appello 04/07/06 Si consideri il seguente schema di base di dati che vuole tenere traccia dei DVD noleggiati dai clienti di una videoteca: CLIENTE (CodiceFiscale, Cognome, Nome, Residenza) DVD (Matricola, TitoloFilm,, Durata) FILM (Titolo,, CognomeRegista, NomeRegista, Genere) NOLEGGIO (CodiceCliente, CodiceDvd, DataInizio, DataFine, Prezzo) Linguaggi Formali Esprimere in algebra, calcolo relazionale e Datalog la seguente query: Trovare i nomi e i cognomi dei clienti che hanno effettuato almeno due noleggi di DVD di genere Fantasy o che hanno noleggiato almeno un film del regista Nanni Moretti nell anno 2004 Π nome, Cognome CodiceFiscale=CodiceCliente Π CodiceCliente Π CodiceCliente Cliente σ (CodiceDVD<>C) (DataInizio<>D) CodiceDVD=Matricola DVD TitoloFilm=Tirolo Dvd.=Film. CodiceCliente=Cod Π CodiceCliente, CodiceDVD σ DataInizio>=01/01/2004 DataInizio<=31/12/2004 Π Matricola DVD TitoloFilm=Tirolo Dvd.=Film. Π Titolo, σ genere= Fantasy Π Matricola, TitoloFilm, Matricola=CodiceDVD Π CodiceCliente, CodiceDVD, DataInizio Noleggio DVD TitoloFilm=Tirolo Dvd.=Film. Π Titolo, Π Matricola,TitoloFilm, σ cognomeregista= moretti nomeregista= nanni DVD FILM DVD Noleggio Π Titolo, σ genere= Fantasy Π Matricola, TitoloFilm, Matricola=C Π Cod,C,D ρ Cod CodiceCliente, C CodiceDvd, D DataInizio FILM FILM DVD Noleggio 1
Linguaggi Formali Calcolo Relazionale {t t1 cliente, t2, t3 noleggio, t4,t5 DVD, t6,t7 Film (t[nome]=t1[nome] t[nome]=t1[cognome] t1[codicefiscale]=t2[codicecliente] t2[matricola]=t4[codicedvd] t3[matricola]=t5[codicedvd] t4[titolofilm]=t6[titolo] t4[]=t6[] t5[titolofilm]=t7[titolo] t5[]=t7[] t6[genere]= Fantasy t7[genere]= Fantasy (t2[codicedvd]<>t3[codicedvd] t2[datainizio]<>t3[datainizio]) ( t8 noleggio, t9 DVD, t10 Film (t1[codicefiscale]=t8[codicecliente] t9[titolofilm]=t10[titolo] t9[]=t10[] t9[matricola]=t8[codicedvd] t8[datainizio] >=01/01/2004 t8[datainizio] <=31/12/2004 t10[cognomeregista]= Moretti t10[nomeregista] = Nanni ))) } Linguaggi Formali - DataLog Clienti(Cognome,Nome) :- DVD (Matricola,TitoloFilm, _,_), FILM (TitoloFilm, _, Moretti, Nanni,_), Noleggio (CF, Matricola, DInizio,_,_), cliente(cf,cognome,nome,_), DInizio> =01/01/2004 DInizio <=31/12/2004 Clienti(Cognome, Nome):- cliente(codicefiscale,cognome,nome,_), DVD (Matricola,TitoloFilm, Film,_), FILM (TitoloFilm, Film, _,_, Fantasy ), DVD (Matricola2,TitoloFilm2, Film2,_), FILM (TitoloFilm2, Film2, _,_, Fantasy ), Noleggio (CodiceFiscale, Matricola, _,_,_), Noleggio (CodiceFiscale, Matricola2, _,_,_), Matricola<>Matricola2 Clienti(Cognome, Nome):- cliente(codicefiscale,cognome,nome,_), DVD (Matricola,TitoloFilm, Film,_), FILM (TitoloFilm, Film, _,_, Fantasy ), Noleggio (CodiceFiscale, Matricola, DataInizio,_,_), Noleggio (CodiceFiscale, Matricola, DataInizio2,_,_), DataInizio<>DataInizio2? - Clienti(X,Y) 2
SQL: interrogazioni Trovare i nomi e i cognomi dei registi che hanno diretto almeno 3 film di genere comico, ognuno dei quali è stato noleggiato almeno una volta SELECT CognomeRegista, NomeRegista FROM FILM WHERE Genere= comico AND (Titolo, ) IN (SELECT TitoloFilm, FROM DVD join Noleggio ON Matricola=CodiceDVD) GROUP BY CognomeRegista, NomeRegista HAVING COUNT(*)>=3 SQL: interrogazioni Trovare i clienti che hanno effettuato il minor numero di noleggi del genere Horror nell anno 2005.. CREATE VIEW Noleggi (CFCliente, N_Noleggi) AS SELECT CodiceCliente, COUNT(*) FROM Noleggio, DVD, Film WHERE Noleggio.CodiceDVD=DVD.Matricola AND Film.Titolo=DVD.Titolo AND Film.=DVD. AND DataInizio>=01/01/2005 AND DataInizio<=31/12/2005 AND Genere= Horror GROUP BY CodiceCliente SELECT Nome, Cognome FROM Cliente JOIN Noleggi ON Cliente.CodiceFiscale=Noleggi.CFCliente WHERE N_noleggi = (SELECT MIN(N_Noleggi) FROM Noleggi) 3
SQL DDL create table FILM ( Titolo varchar(30), char (4), CognomeRegista varchar(15), NomeRegista varchar (20), Genere varchar(15), primary key (Titolo, ) ) SQL DDL create table DVD ( Matricola char(6), TitoloFilm varchar(30), char (4), Durata Time, primary key(matricola), foreign key (TitoloFilm,, ) references FILM(Titolo, ) on delete cascade on update cascade) 4
SQL: espressione di vincoli Per i prestiti di durata maggiore di 2 giorni il prezzo deve essere superiore a 6 euro CREATE ASSERTION ControlloPrezzo CHECK ( NOT EXISTS (SELECT * FROM Noleggio WHERE Prezzo < 6 AND (DataFine-DataInizio) <2)) oppure CREATE ASSERTION ControlloPrezzo CHECK ( 6< ALL (SELECT Prezzo FROM Noleggio WHERE (DataFine-DataInizio) <2)) Progettazione Nome D_inizio D_fine Numero Data Risultato Torneo Organizzazione Giornata Calendario Partita Città Impianto (0,N) Sponsorizza Classifica Gioca in casa Gioca fuori casa Sponsor Nome Punteggio Composizione ordine (0,1) Squadra (6,N) Nome Città Fondazione Città Capitale sociale Stipulazione Cognome Giocatore CodiceFiscale Data nascita Nome Intestatario Nazionalità Data inizio Data_fine Contratto Ruolo (0,1) 5
Progetto logico Torneo(Nome, D_inizio, D_fine) Sponsor (Nome, Città, Capitale sociale) Sponsorizzazione (NomeTorneo, NomeSponsor) Giornata(NomeTorneo, D_inizio, Numero, Data) Partita (NomeTorneo, NumeroGiornata, SquadraOspitante, Risultato, Città, Impianto, SquadraOspite) Squadra (Nome,Città, Fondazione, NomeSponsor) Classifica (NomeTorneo, NomeSquadra, Punteggio) Giocatore (CodiceFiscale, Nome, Cognome, DataNascita, Nazionalità) Contratto(NomeSquadra, CodiceGiocatore, Data_inizio, Data_fine,Ruolo) 6