Basi di Dati
Transcript
Basi di Dati
Basi di Dati Soluzione della prima prova intermedia del 8 Novembre 2005 Esercizio 1 (3 punti) Si consideri la seguente definizione di relazione: CREATE TABLE Dipartimento( did nome managerId budget PRIMARY KEY FOREIGN KEY CHAR(10), CHAR(20) NOT NULL, INTEGER, REAL, (did), (managerId)REFERENCES Impiegato (iid) ON DELETE SET NULL ON UPDATE CASCADE ) a) Spiegare il significato di NOT NULL. b) Spiegare il significato di FOREIGN KEY. c) Spiegare cosa accade in questa tabella se cancello / modifico in Impiegato un iid. Soluzione Si faccia riferimento alla parte del libro di testo relativa alla definizione delle tabelle in SQL. Schema Relazionale per gli Esercizi 2, 3 e 4 Considerare lo schema di base di dati contenente le relazioni: Quadro (codice: string, autore: string, periodo: integer) Mostra (codice: string, nome: string, anno: integer, organizzatore: string) Espone (codiceMostra: string, codiceQuadro: string, sala: string) Foreign key codiceMostra References Mostra (codice) Foreign key codiceQuadro References Quadro (codice) Nella relazione Quadro l’attributo periodo indica l’anno in cui è stato realizzato il quadro. Esercizio 2 (3 punti) Formulare in Algebra Relazionale la seguente interrogazione: Per i quadri esposti nella mostra ‘ArteNos 2005’, trovare il codice dei quadri realizzati più recentemente. I quadri esposti piu' recentemente sono quelli realizzati nel periodo piu' recente. Soluzione ρ( M, πcodice σnome=‘ArteNos 2005’ Mostra ) ρ( R1, πcodiceMostra,codiceQuadro σcodiceMostra=codice (Espone M )) ρ( R2, πcodiceMostra,codiceQuadro,periodo σcodiceQuadro=codice (R1 Quadro )) ρ( R3, R2 ) ρ( R4(1→codiceMostra, 2→codiceQuadro, 3→periodo, 4→codiceM2, 5→codiceQ2, 6→periodo2), σR2.periodo<R3.periodo ( R2×R3 )) πcodiceQuadro (R2 - πcodiceMostra,codiceQuadro,periodo R4) Basi di Dati Prima prova intermedia del 8 Novembre 2005 1 Esercizio 3 (3 punti) Formulare in SQL l'interrogazione dell'esercizio precedente. Soluzione SELECT FROM WHERE Q.codice Espone E, Mostra M, Quadro Q E.codiceQuadro=Q.codice AND E.codiceMostra=M.codice AND M.nome=’ArteNos 2005’ AND Q.periodo>=ALL (SELECT Q2.periodo FROM Espone E2, Mostra M2, Quadro Q2 WHERE E2.codiceQuadro=Q2.codice AND M2.nome=’ArteNos 2005’ AND E2.codiceMostra=M2.codice) Oppure SELECT FROM WHERE Q.codice Espone E, Mostra M, Quadro Q E.codiceQuadro=Q.codice AND E.codiceMostra=M.codice AND M.nome=’ArteNos 2005’ AND Q.periodo= (SELECT MAX(Q2.periodo) FROM Espone E2, Mostra M2, Quadro Q2 WHERE E2.codiceQuadro=Q2.codice AND M2.nome=’ArteNos 2005’ AND E2.codiceMostra=M2.codice) Esercizio 4 (3 punti) Formulare in SQL la seguente interrogazione: trovare i nomi dei pittori dei quadri che sono stati esposti nel maggior numero di mostre. Soluzione SELECT FROM WHERE Basi di Dati DISTINCT Q.autore Quadro Q Q.codice IN (SELECT E.codiceQuadro FROM Espone E GROUP BY E.codiceQuadro HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM Espone E1 GROUP BY E1.codiceQuadro)) Prima prova intermedia del 8 Novembre 2005 2 Esercizio 5 (2 punti) Si consideri il seguente codice C con SQL incapsulato. Commentare la porzione di codice dalla riga 15 alla riga 20. 1. func(short year) 2. { 3. char SQLSTATE[6]; 4. EXEC SQL BEGIN DECLARE SECTION 5. char c_morgaz[20]; 6. char c_mnome[30]; 7. short c_anno; 8. EXEC SQL END DECLARE SECTION 9. c_anno = year; 10. EXEC SQL DECLARE mInfo CURSOR FOR 11. SELECT M.organizzatore, M.nome, M.anno 12. FROM Mostra M 13. WHERE M.anno > :c_anno 14. ORDER BY M.organizzatore; 15. EXEC SQL OPEN mInfo; 16. do { 17. EXEC SQL FETCH mInfo INTO :c_morgaz, :c_mnome, :c_anno; 18. printf(“%s ha organizzato la mostra %s nell’anno %d\n”, c_morgaz, c_mnome, c_anno); 19. } WHILE (SQLSTATE != ‘02000’); 20. EXEC SQL CLOSE mInfo; 21. } Soluzione Si faccia riferimento alla parte del libro di testo relativa all’embedded SQL. Basi di Dati Prima prova intermedia del 8 Novembre 2005 3