sql: lezione 9 nataliya rassadko [email protected]
TRANSCRIPT
SQL Lezione 9
Nataliya Rassadkorassadkodisiunitnit
Agenda
Esami degli anni precedenti Schema Esempi di compiti per esami
Le domande tipiche 12
SQL + algebra relazionale + datalog JOIN Subquery Raggruppamento e operatori aggregati Query recorsivi
NULL Operatori aggregati
Normalizzazione a partire da functional dependencies BCNF dependency-preserving decomposizione 3NF Con spiegazioni
ER Correggere gli errori Disegnare dalla descrizione in linguaggio naturale Scrivere SQL espressioni in DDL
Le domande tipiche 22
JDBC Passi principali
Transazioni Identificare se conflict-serializable Protocollo 2PL Timestamp-based protocollo
Esempi0 1
Decidere se ogni scheduler egrave serializzabile o meno
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C)
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
Come testare conflict-serializability
Graf di precedenzaT1ltST2 se per azioni A1 di T1 e A2 di T2
A1 occorre prima di A2
A1 e A2 riguardano lo stesso elemento di DB
Una delle due azione A1 A2 egrave write
Nodi di graf sono le transazioni dello schema S
Tra nodi i e j esiste lrsquoarco se TiltSTj
Soluzione per Esempio 1 Graf di Precedenza
S1 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C) S2 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
1
3
2 1
3
2
Esempio 2
Descrivere che fa un scheduler con timestamps con le seguente operazioni S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Agenda
Esami degli anni precedenti Schema Esempi di compiti per esami
Le domande tipiche 12
SQL + algebra relazionale + datalog JOIN Subquery Raggruppamento e operatori aggregati Query recorsivi
NULL Operatori aggregati
Normalizzazione a partire da functional dependencies BCNF dependency-preserving decomposizione 3NF Con spiegazioni
ER Correggere gli errori Disegnare dalla descrizione in linguaggio naturale Scrivere SQL espressioni in DDL
Le domande tipiche 22
JDBC Passi principali
Transazioni Identificare se conflict-serializable Protocollo 2PL Timestamp-based protocollo
Esempi0 1
Decidere se ogni scheduler egrave serializzabile o meno
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C)
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
Come testare conflict-serializability
Graf di precedenzaT1ltST2 se per azioni A1 di T1 e A2 di T2
A1 occorre prima di A2
A1 e A2 riguardano lo stesso elemento di DB
Una delle due azione A1 A2 egrave write
Nodi di graf sono le transazioni dello schema S
Tra nodi i e j esiste lrsquoarco se TiltSTj
Soluzione per Esempio 1 Graf di Precedenza
S1 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C) S2 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
1
3
2 1
3
2
Esempio 2
Descrivere che fa un scheduler con timestamps con le seguente operazioni S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Le domande tipiche 12
SQL + algebra relazionale + datalog JOIN Subquery Raggruppamento e operatori aggregati Query recorsivi
NULL Operatori aggregati
Normalizzazione a partire da functional dependencies BCNF dependency-preserving decomposizione 3NF Con spiegazioni
ER Correggere gli errori Disegnare dalla descrizione in linguaggio naturale Scrivere SQL espressioni in DDL
Le domande tipiche 22
JDBC Passi principali
Transazioni Identificare se conflict-serializable Protocollo 2PL Timestamp-based protocollo
Esempi0 1
Decidere se ogni scheduler egrave serializzabile o meno
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C)
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
Come testare conflict-serializability
Graf di precedenzaT1ltST2 se per azioni A1 di T1 e A2 di T2
A1 occorre prima di A2
A1 e A2 riguardano lo stesso elemento di DB
Una delle due azione A1 A2 egrave write
Nodi di graf sono le transazioni dello schema S
Tra nodi i e j esiste lrsquoarco se TiltSTj
Soluzione per Esempio 1 Graf di Precedenza
S1 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C) S2 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
1
3
2 1
3
2
Esempio 2
Descrivere che fa un scheduler con timestamps con le seguente operazioni S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Le domande tipiche 22
JDBC Passi principali
Transazioni Identificare se conflict-serializable Protocollo 2PL Timestamp-based protocollo
Esempi0 1
Decidere se ogni scheduler egrave serializzabile o meno
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C)
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
Come testare conflict-serializability
Graf di precedenzaT1ltST2 se per azioni A1 di T1 e A2 di T2
A1 occorre prima di A2
A1 e A2 riguardano lo stesso elemento di DB
Una delle due azione A1 A2 egrave write
Nodi di graf sono le transazioni dello schema S
Tra nodi i e j esiste lrsquoarco se TiltSTj
Soluzione per Esempio 1 Graf di Precedenza
S1 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C) S2 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
1
3
2 1
3
2
Esempio 2
Descrivere che fa un scheduler con timestamps con le seguente operazioni S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Esempi0 1
Decidere se ogni scheduler egrave serializzabile o meno
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C)
r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
Come testare conflict-serializability
Graf di precedenzaT1ltST2 se per azioni A1 di T1 e A2 di T2
A1 occorre prima di A2
A1 e A2 riguardano lo stesso elemento di DB
Una delle due azione A1 A2 egrave write
Nodi di graf sono le transazioni dello schema S
Tra nodi i e j esiste lrsquoarco se TiltSTj
Soluzione per Esempio 1 Graf di Precedenza
S1 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C) S2 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
1
3
2 1
3
2
Esempio 2
Descrivere che fa un scheduler con timestamps con le seguente operazioni S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Come testare conflict-serializability
Graf di precedenzaT1ltST2 se per azioni A1 di T1 e A2 di T2
A1 occorre prima di A2
A1 e A2 riguardano lo stesso elemento di DB
Una delle due azione A1 A2 egrave write
Nodi di graf sono le transazioni dello schema S
Tra nodi i e j esiste lrsquoarco se TiltSTj
Soluzione per Esempio 1 Graf di Precedenza
S1 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C) S2 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
1
3
2 1
3
2
Esempio 2
Descrivere che fa un scheduler con timestamps con le seguente operazioni S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Soluzione per Esempio 1 Graf di Precedenza
S1 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r1(A) r2(C) S2 r2(B) r1(A)w3(A) r3(C)w3(B)w2(A) r2(C)
1
3
2 1
3
2
Esempio 2
Descrivere che fa un scheduler con timestamps con le seguente operazioni S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Esempio 2
Descrivere che fa un scheduler con timestamps con le seguente operazioni S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Timestamp-based scheduler
Ogni transazione egrave associata con timestamp (inizio della transazione)
Ogni oggeto egrave associato con due valori RTM STM
Operazione read(x ts) egrave cessata se tsltWTM(x) altrimenti operazione egrave accetata e RTM(x)=ts
Operazione write(x ts) egrave cessata se tsltWTM(x) o tsltRTM(x) altrimenti operazione egrave accetata e WTM(x)=ts
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Soluzione per Esempio 2
S1 st1 st2 r2(A)w2(B)w1(B) S2 st1 st2 r2(A)w2(B)w1(B)Abort2
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Request Response Value
read(A st2) OK RTM(A)=st2
write(B st2) OK WTM(B)=st2
write(B st1) NO killed
Abort2Possiamo write con st1
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Esempio 3
Dire se il programma seguente ersquo conflict-serialzable In caso affermativo cosrsquoersquo una esecuzione seriale (serial execution) equivalente In caso negativo perche no r4(C) r1(A) r2(B) w2(A) w3(B) w3(A) w4(B) w2(C) r2(C) r1(A) w3(B) w4(A) w1(C) w2(B) w3(A) w2(A)
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Esempio 4
Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni st1 r1(A) st2 w2(B) r2(A) w1(B)
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Esempio 4
Inserire dei locks (shared exclusive o increment locks) nelle seguenti transizioni in conformitarsquo al 2PL Descrivere come unrsquo programmatore tratterarsquo il programma risultate r3(C) r1(A) inc2(B) w3(C) w1(B) w2(B)
Risposta xl3(C)r3(C)sl1(A)r1(A)u1(A)xl2(B)inc2(B)w3(C)u3(C)xl1(B)w1(B)u1(B)w2(B)u2(B)
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Ricordiamo
La transazione egrave consistente se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X)
interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X)
interveniente Tutti lock devono occorrere prima di unlock sullo stesso
elemento (2PL)
Lo scheduler egrave legale se Dopo xli(X) non puograve occorrere xlj(X) o slj(X) senza ui(X)
interveniente Dopo sli(X) non puograve occorrere xlj(X) senza ui(X)
interveniente
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Esercizi su FD
ABCD A-gtBC B-gtC C-gtD BCNF Dependency-preserving Se non egrave dependency preserving trovare 3NF
ABCD
BCD AB
CD BC
B-gtC
C-gtD
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Dependency Preserving Decomposition
CD BC AB
C-gtD B-gtC
A-gtBC
B-gtC
C-gtD
(F1F2F3)+=F+
(CB)+=BCDne(ABC)+
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
3NF Passo 1
Trovare calnonical cover di FD Tutti FD nonredundant httpwwwcsnmsuedu~ipivkinacs482Slidescanoni
calCoverpdf
bullrepeat
bullUse the union rule to replace dependencies of the form X-gtB1 and X-gtB2 with X-gtB1B2
bullFind a functional dependency X-gtY with an extraneous attribute and delete it from X-gtY
bulluntil F does not change
A is extraneous in X
1048707 (X ndash A)+capAne
use F to calculate closure
A is extraneous in Y
1048707 X+capAne
use Frsquo = (F ndash X rarr Y) X rarrcup (Y ndash A)
Non si trova tramite
chiusura
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Canonical cover nel nostro caso
A-gtBC B-gtC C-gtD
B-gtC possiamo escludere subito perchegrave redundant
Rimangono A-gtBC C-gtDB o C possono essere extraneous
A-gtBC C-gtD
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash B)=C-gtD A-gtCcup
A+=ACD
ACDcapB=
B non egrave extraneous
Frsquo = (F ndash A rarr BC) A rarrcup (BC ndash C)=C-gtD A-gtBcup
A+=AB
ABcapC=
C non egrave extraneous
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
3NF Passi 2-4
Creare relazione per ogni FD in canonical cover
Eliminare la nuove arelazione se egrave subset di una altra relazione
Se nessuna relazione contiene la chiave di R creare la relazione con attributi di chiave di R Determinare le chiavi di R
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Nel nostro caso
A-gtBC C-gtD
R1=ABC - la chiave della relazione inizialeR2=CD
3NF
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Altri esercizi su FD
ABCDE AB-gtC C-gtE E-gtA ABCDEF A-gtB CE-gtD CD-gtA BC-gtD AE-
gtFABCDEF A-gtF BC-gtF AE-gtD F-gtE
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ER Esempio
Disegnare un modello Entity-relationship per il seguente esempio Fare delle assunzione ragionevoli per chiavi cardinalitarsquo delle relazione attributi addizionali etc e rendere i presupposti espliciti
Il modello ersquo il database di una linea aerea Contiene 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Le relazioni dovrebbero includere informazioni su 1 Chi ersquo prenotato su quale volo 2 Chi ersquo il pilota per ciascun volo 3 Quale aereo ersquo assegnato a quale volo
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
Lo schema di creazione
Entitagrave con attributi 1 Passengers (names addresses phone numbers etc) 2 Flights (flight number origin destination date time duration etc) 3 Planes (manufacturer capacity model number) 4 Pilots (name salary etc)
Relazioni 1 Chi ersquo prenotato su quale volo Passenger-Flight 2 Chi ersquo il pilota per ciascun volo Pilot-Flight 3 Quale aereo ersquo assegnato a quale volo Flight-Plane
Cardinalitagrave Passenger-Flight n-1 Pilot-Flight n-1 Flight-Plane 1-1
Chiavi Integritagrave referenziale Vincoli su dominio Entitagrave debole
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
NULL Esempio
(a) SELECT B FROM R WHERE AgtC OR A=C(b) SELECT MIN(A)MIN(B)MIN(C) FROM R(c) SELECT MIN(A)AVG(B)MAX(B)
A B C
1 NULL 1
2 2 2
NULL 2 NULL
3 NULL 5
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Trovare i modelli dei prodotti IBM che sono Notebook oDesktop
SELECT Modello FROM Prodotti WHERE Marca = IBMlsquo AND ( Nome = lsquoNotebooklsquo OR Nome = lsquoDesktoprsquo )
Fornitori(CodiceFornitoreNomeIndirizzoCittagrave) Prodotti (CodiceProdottoNomeMarcaModello) Catalogo (CodiceFornitoreCodiceProdottoCosto)
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Considerare il seguente schema
SELECT B FROM R where A=C SELECT FROM A cap SELECT FROM C SELECT MIN(C) MAX(A)AVG(B) FROM R
A B C
1 2 NULL
5 4 5
NULL 6 2
NULL NULL NULL
1 (4)
2 (5)
3 (254)
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce lrsquoanno di nascitaMovie(titleyearlengthinColorstudioNameproducerC)StarsIn(movieTitlemovieYearstarName) MovieStar(nameaddressgenderbirthdate) MovieExec(nameaddresscertnetWorth) Studio(nameaddresspresC)
SELECT title FROM MovieStarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=lsquoFrsquo and birthdate is null)
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute ipotizzando che se vi sono piugrave proprietari per una moto lrsquoammontare delle tasse viene equamente suddiviso tra i proprietari (Usare le viste)
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
Create view TasseInd(TargaTassa) as SELECT TargaTassecount() FROM Moto join Proprietario on MotoTarga= ProprietarioTarga GROUP BY Targa
Select NomeSUM(Tassa) FROM Proprietario join TasseInd on ProprietarioTarga=TasseIndTarga GROUP BY Nome
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti
Moto(TargaCilindrataMarcaNazioneTasse) Proprietario(NomeTarga)
SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON ProprietarioTarga=MotoTarga WHERE NazioneltgtrsquoGiapponersquo) GROUP BY Nome HAVING COUNT(distinct Marca)gt=2
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Estrarre la cittagrave in cui si trova lo stadio in cui la squadra italiana gioca piugrave partite
STADIO(NomeCittagraveCapienza) INCONTRO(NomeStadioDataOraSquadra1Squadra2) NAZIONALE(PaeseContinenteCategoria)
CREATE VIEW StadiItalia(NomeStaioNroPartite) as SELECT NomeStadiocount() FROM Incontro WHERE Squadra1=lsquoItaliarsquo or Squadra2=lsquoItaliarsquo group by NomeStadio
SELECT Cittagrave FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Calcolare per ogni dipartimento e per ogni anno il numero di progetti giagrave terminati a cui ha partecipato escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT id_dip anno_in COUNT() AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Prid_prog=Paid_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT() lt3) GROUP BY id_dip anno_in
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Elencare le universitagrave che non hanno mai partecipato a progetti giagrave terminati
DIPARTIMENTI(IDDIPUNIVERSITASTATO) PARTECIPANO(IDDIPAIDPROG) PROGETTI(IDPROGTITOLOANNOINIZIOANNOFINE)
SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON Did_dip = Paid_dip JOIN Progetti Pr ON Paid_prog=Prid_prog WHERE anno_fi IS NOT NULL)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media di quellrsquoalbergo
Create View acconti as SELECT cod_alb AVG(acconto) AS media FROM prenot GROUP BY cod_alb
SELECT alberghinomeclienticognomeclientinome clienticitta FROM clienti acconti prenot alberghi WHERE clienticod_cli=prenotcod_cli AND prenotcod_alb=acconticod_alb AND prenotcod_alb=alberghicod_alb AND prenotacconto gt= accontimedia
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Per ogni albergo ritornare cognome nome e cittagrave dei clienti che hanno versato un acconto superiore alla media
Clienti(Cod_cliCognomeNomeCittaSalarioEta) Prenot(Cod_cliCod_albCameraGiorniAcconto) Alberghi(Cod_albNomeCitta)
A
SELECT AVG(acconto) FROM prenot
B
SELECT alberghinome clienticognome clientinome clienticitta FROM clienti prenot alberghi WHERE clienticod_cli = prenotcod_cli AND prenotcod_alb = alberghicod_alb AND prenotaccontogtA
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Trovare le materie su cui sono stati fatti almeno 6 appelli in un annoStudenti(MatricolaNomeProvinciaAnnoNascita) Esami(MateriaMatricolaNumeroAppelloVotoAnno)
SELECT AnnoMateria FROM ( SELECT DISTINCT AnnoMateriaNumeroAppello FROM Esami) GROUP BY AnnoMateria HAVING COUNT()gt5
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedigraveAeroporto (CittagraveNazioneNumPiste) Volo(IdVoloGiornoSettCittaPartOraPartCittaArrOraArrTipoAereo) Aereo(TipoAereoNumPasseggeriQtMerci)
SELECT CittaArrsum(numpassegg) FROM VOLOAEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLOTipoAereo=AEREOTipoAereo group by CittaArr
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993
SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)
Regista(Nome DataNascita Nazionalita`) Film(Titolo NomeRegista Anno) Proiezione(Nomecinema Nomefilm Citta`)
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta ma che hanno scritto articoli per altri giornali
SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE GCitta=CittaSede)
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore
Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore ltgtNome GROUP BY GiornaleAutore HAVING COUNT()gt (SELECT COUNT() FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND AGiornale=A1Giornale)
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))
ESERCIZIO
Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati Giornalista (NOMEDataNCitta) Articolo (TITOLODATAAutoreGenereGiornalePagina) Giornale (TESTATADirettoreCittaSede)
CREATE VIEW GeneriGiornale (GenereGiornaleNumero) S SELECT GenereGiornaleCOUNT() FROM Articolo GROUP BY GenereGiornale
CREATE view GenerePref (GenerePref) AS SELECT GiornaleGenere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE GGiornale=Giornale))