40
SQL: Lezione 9 Nataliya Rassadko [email protected]

SQL: Lezione 9 Nataliya Rassadko [email protected]

Embed Size (px)

Citation preview

Page 1: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 2: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 3: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 4: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 5: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 6: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 7: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 8: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 9: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 10: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 11: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 12: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 13: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 14: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 15: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 16: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 17: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 18: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 19: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 20: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 21: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 22: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 23: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 24: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 25: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 26: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 27: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 28: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 29: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 30: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 31: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 32: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 33: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 34: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 35: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 36: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 37: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 38: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 39: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))

Page 40: SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

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))