You are on page 1of 4

Soluzione dellesercitazione di Basi di Dati del

12/05/2011

Gianluca Gippetto - Universit degli studi di Palermo

Si riporta lo schema della base di dati:

Museo(Codice,Nome,Via,Citt,Direttore)
Sala(CodiceMuseo,NumSala,NumOpere,Superficie,NumPorte,Guardiano)
Umidit(CodiceMuseo,NumSala,Data,Ora,PercUmidit)
Opera(Codice,NomeOpera,Autore,DataAcquisto,PerMaxUmidit,CodiceMuseo,NumSala)
Personale(CF,Nome,DataAssunzione)

Le chiavi primarie sono sottolineate, le chiavi esterne sono in corsivo. Il direttore di un


museo e il direttore di una sala sono entrambi parte del personale.

Esercizio 1
Elencare CF e Nome del personale (direttori e guardiani) che lavora in un museo di
Mantova.
 
 
CF,M.Nome M.NomeNome Citt=Mantova (Museo) 1Direttore=CF Personale


CF,M.Nome M.NomeNome Citt=Mantova (Museo)
   
1Codice=CodiceMuseo Sala 1Guardiano=CF Personale

-- Versione 1
select CF, Nome
from Museo M join Personale P
on(M.direttore = P.CF)
where M.Citta = Mantova
UNION
select CF, Nome
from Sala S, Museo M, Personale P
where M.Citta = Mantova and
S.CodiceMuseo = M.Codice and
S.Guardiano = P.CF

-- Versione 2

Con il contributo di Davide Guastella, che ringrazio per aver scritto (in LATEX!) linterrogazione
dellesercizio 2 in algebra relazionale.

1
Select CF, Nome
from Personale
where CF in (Select direttore
from Museo
where citta = Mantova)
or in (Select guardiano
from Museo M join Sala S on(M.codice = S.codiceMuseo)
where citta = Mantova)

Esercizio 2
Indicare il museo (o i musei) nel quale situata la sala con percentuale di umidit
minima. 1

Raux = codiceMuseo,numSala (Umidit) \


 
codiceMuseo,numSala PU>PercUmidit Umidit 1


codiceMuseo,numSala,PU PUPercUmidit (Umidit)

La soluzione data da
Raux 1codMuseo=Codice Museo
In sostanza, per individuare le sale con percentuale di umidit minima:
1. si eseguito un self join di Umidit;
2. si sono selezionate tutte le sale per cui esiste unaltra sala con percentuale di
umidit minore: le uniche sale che non soddisfano tale propriet sono proprio
quelle con percentuale di umidit minima;
3. dallinsieme di tutte le sale si sono sottratte quelle ottenute nella precedente
selezione: per quanto detto al punto 2, le uniche sale rimaste sono quelle con
percentuale di umidit minima.

select Codice, Nome


from Museo M join Umidita U
on(M.codice = U.CodiceMuseo)
where PercUmidita = (select min(PercUmidita)
from Umidita)

Esercizio 3
Elencare i musei le cui sale ospitano tutte almeno 3 opere.

codiceMuseo,Nome (Museo) \

codiceMuseo,Nome numOpere<3 (Sala) 1codiceMuseo=codice (Museo)

1
Mi sono permesso di aggiungere (o i musei) al testo originale dellesercizio: in linea di principio,
potrebbero esistere due o pi sale, di musei diversi, con la stessa percentuale di umidit minima.

2
-- Versione 1
select Codice, Nome
from Museo
where Codice not in (select CodiceMuseo
from Sala
where numOpere<3)

-- Versione 2
select Codice, Nome
from Museo
EXCEPT
select Codice, Nome
from Museo M join Sala S
on(M.Codice = S.CodiceMuseo)
where numOpere<3

Esercizio 4
Elencare il nome e la data di acquisto delle opere collocate in sale senza guardiano.

NomeOpera,DataAcquisto Guardiano=null (Sala) 1 Opera

select NomeOpera,DataAcquisto
from Opera O, Sala S -- Luso di natural join e sconsigliato
where Guardiano = null and
O.CodiceMuseo = S.codiceMuseo and
O.NumSala = S.NumSala

Esercizio 5
Per ogni museo, indicare qual la percentuale di umidit minima fra quelle delle sue
sale.
select M.Codice, M.Nome, S.PercUmidita
from Museo M join Sala S
on(M.Codice = S.CodiceMuseo)
where S.PercUmidita = (select min(PercUmidita)
from Sala
where CodiceMuseo = M.Codice)

Esercizio 6
Per ogni museo, indicare la sala con percentuale di umidit minima.
/* Dobbiamo appoggiarci ad una vista creata a
partire dalla query dellesercizio 5 */
create view UmiditaMinMuseo (codiceMuseo,nomeMuseo,minPercUmidita)
as <Query Esercizio 5>

3
select M.codice, numSala as Sala_con_percUmidita_minima
from UmiditaMinMuseo M join Sala S
on(M.codiceMuseo = S.codiceMuseo)
where minPercUmidita = S.percUmidita

Esercizio 7
Indicare i nomi dei musei che hanno pi di 20 sale.
select M.codice, M.nome
from Museo M join Sala S
on(M.codice = S.codiceMuseo)
group by M.codice
having count(*)>20