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