ESAME DB 07/07/2005
Prof. Giovanni Giuffrida
PRIMO MODULO (DB1)
Per ogni esercizio è indicato un punteggio massimo. Il punteggio massimo è dato se l’esercizio è privo di
errori.
RICORDATE CHE SE AVETE GIA’ SOSTENUTO LA PROVA DEL 13/06/2005 PER QUESTO
MODULO E SIETE STATI RESPINTI QUESTO COMPITO VI VERRA’ ANNULLATO.
NON DIMENTICATE IL NOME E LA MATRICOLA
Nome ________________________________________
Matricola: ___________________
INDICATE COSA DOVETE REGISTRARE
DB 9cfu
DB1 6cfu
DB2 6cfu
Altro: __________
Punteggio finale (questa parte verrà riempita dal docente)
1.1
1.2
a)
b)
c)
1.3
d)
1.4
======== BUON LAVORO ========
1.1 Algebra relazionale
Dato il seguente schema relazionale:
Classe(id_classe, tipo, stato, numeroCannoni, peso)
Nave(nome, id_classe, anno)
Battaglia(nome, data)
Risultato(nomeNave,NomeBattaglia, risultato)
Dove per Classe si intende il modello della nave, es: Portaerei, Incrociatore, etc. Esprimere in Algebra
Relazionale le seguenti query:
a.
[2 punti] Il trattato di Washington 1921 stabilisce che le navi non devono superare le 35000
tonnellate. Elencare le navi che violano questo trattato.
b. [3 punti] Dare il nome, l'anno di produzione ed il numero di cannoni della nave coinvolta nella
battaglia di Guadalcanal.
c. [5 punti] Trovare le classi di navi che hanno solo una nave come membro della classe.
d. [5 punti] Trovare le navi che sono state danneggiate in una battaglia ma successivamente sono state
riutilizzate.
NOTA: Usare la notazione lineare per semplificare le espressioni algebriche.
1.2 SQL 1 [-8,+8 punti]
L’anti-semijoin di due relazioni R e S è l’insieme delle tuple spurie di R, cioè quelle tuple in R che non
hanno una tupla corrispondente in S. Considera la relazione R(A,B,C) e S(A,B,D) dove <A,B> rappresenta la
chiave primaria sia in R che in S. Quindi l’anti-semijoin di R e S sarà un insieme di tuple (A,B,C).
Indicare quali delle seguenti query SQL implementano l’anti-semijoin correttamente indicano SI o NO nella
colonna di destra. Nota che la notazione “R.*” indica tutte le colonne di R.
Avrete 1 punto per ogni risposta corretta, -1 per ogni risposta sbagliata e 0 se non rispondete. Quindi,
meglio non provare ad indovinare la risposta!
QUERY
select * from R
where <A,B> not in (select A,B from S)
select R.* from R,S
where R.A <> S.A and R.B <> S.B
select R.* from R,S
where R.A <> S.A or R.B <> S.B
select * from R
where not exists (select * from S where S.A = R.A and S.B = R.B)
select * from R
where not exists (select * from S where S.A = R.A or S.B = R.B)
select * from R
where A <>any (select A from S) iand B <>any (select B from S)
select * from R
where A <>all (select A from S) or B <>all (select B from S)
select * from R
where 1 > (select count(*) from S where S.A = R.A and S.B = R.B)
SI/NO
1.3 SQL 2 [5 punti]
Considera una relazione con un solo attributo R(A). Scrivere una query SQL quanto più semplice possibile
che restituisca tutti i valori di A che compaiono in R almeno 3 volte e mostrarli una volta sola in output. Puoi
assumere che non ci siano NULL nella relazione.
1.4 SQL 3 [6 punti]
Considera una relazione Chess(Player, Punti) che contiene i risultati di una sfida di scacchi. Ogni attributo
preso singolarmente è chiave nella relazione, cioè, un giocatore è riportato una volta sola e due giocatori non
possono avere lo stesso punteggio finale. Non ci sono NULL nella relazione. Considera la seguente query:
select player
from Chess C1
where 2 > (select count(*) from Chess C2
where C2.points > C1.points)
Interpreta la query di cui sopra e descrivi in modo sintetico cosa fa.