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.