Basi di dati I 19 luglio 2018 Esame Compito A Durata: un ora e trenta minuti. Cognome: Nome: Matricola: Domanda 1 (15%) Considerare le seguenti relazioni (tutte senza valori nulli) Prodotti (Codice, Nome, Prezzo) Magazzini (Codice, Nome, Città) Giacenze (Prodotto, Magazzino, Quantità), con vincoli di integrità referenziale fra Prodotto e la chiave di Prodotti e fra Magazzino e la chiave di Magazzini Ordini (Codice, Prodotto, Quantità), con vincolo di integrità referenziale fra Prodotto e la chiave di Prodotti Siano le seguenti le cardinalità delle relazioni Prodotti: cardinalità C P = 2000 Magazzini: cardinalità C M = 20 Giacenze: cardinalità C G = 15.000 Ordini: cardinalità C O = 5000 Indicare la cardinalità del risultato di ciascuna delle seguenti interrogazioni SQL, specificando l intervallo nel quale essa può variare; indicare simboli e numeri. Min (simboli e valore) Max (simboli e valore) select prodotto, magazzino from giacenze join prodotti p on prodotto = p.codice select p.codice as prodotto, m.codice as magazzino from prodotti p, magazzini m select o.codice as ordine, prodotto, nome, quantita from ordini o join prodotti p on prodotto = p.codice where quantita > 5 select prodotto, magazzino from giacenze join prodotti p on prodotto = p.codice join magazzini m on magazzino = m.codice where prezzo > 100
Basi di dati I 19 luglio 2018 Compito A Domanda 2 (15%) Considerare la seguente base di dati sullo schema mostrato nella domanda precedente: Prodotti Codice Nome Prezzo 1 FrigoFreddo 1000 2 LavaBene 800 3 StiroTutto 50 4 PilaLungaDurata 1 Giacenze Prodotto Magazzino Quantità 1 11 3 1 12 2 2 11 1 3 11 10 4 11 100 4 12 200 4 13 150 4 14 150 Magazzini Codice Nome Città 11 Milano Centro Milano 12 Milano Fiera Milano 13 Italia Centrale Roma 14 Sud Caserta Ordini Codice Prodotto Quantità 101 1 2 102 2 2 103 2 1 104 3 1 105 4 500 106 4 300 Mostrare il risultato di ciascuna delle interrogazioni seguenti 1. select codice, nome, sum(quantita) as giacenzatotale from prodotti join giacenze on codice=prodotto group by codice, nome 2. select codice, nome from magazzini m from prodotti p from giacenze where prodotto = p.codice and magazzino = m.codice))
Basi di dati I 19 luglio 2018 Compito A Domanda 3 (20%) Con riferimento allo schema di base di dati utilizzato nelle domande precedenti, formulare le seguenti interrogazioni in SQL 1. Trovare gli ordini che possono essere interamente soddisfatti con la giacenza in un magazzino (per i quali cioè esiste un magazzino che abbia, per il prodotto ordinato nell ordine, una giacenza maggiore o uguale alla quantità ordinata). Mostrare codice e nome tanto del prodotto quanto del magazzino e le due quantità. 2. Trovare per ogni prodotto la giacenza totale (cioè la somma delle quantità disponibili nei vari magazzini); mostrare codice e giacenza totale. 3. Trovare i prodotti ordinati che hanno giacenze (non è importante la quantità) in tutti i magazzini. Mostrare codice e nome del prodotti.
Basi di dati I 19 luglio 2018 Compito A Domanda 4 (25%) Mostrare lo schema concettuale di una base di dati per un insieme di gallerie di pittura, secondo le seguenti specifiche. Ogni galleria ha un nome, si trova in una città (della quale interessa anche la nazione, con relativa sigla) e ha una serie di sale, ognuna delle quali ha un nome e una dimensione. Le gallerie espongono quadri, per ognuno dei quali interessano l autore (con codice, cognome, nome e nazione di nascita), l anno di esecuzione e la sala nella quale viene esposto (che si assume fissa: ogni quadro si trova in una sala di una galleria) Indicare almeno un identificatore per ogni entità (introducendo codici identificativi ogni volta lo si ritenga opportuno) e mostrare le cardinalità delle relationship
Basi di dati I 19 luglio 2018 Compito A Domanda 5 (10%) Con riferimento ad una relazione Cittadini(CF, Nome, Reddito, TitoloDiStudio), scrivere le interrogazioni SQL che calcolano, per ciascun titolo di studio, il reddito medio dei cittadini che hanno tale titolo, nei due casi seguenti: si usa il valore nullo per indicare che il reddito non è noto si usa il valore -1 per indicare che il reddito non è noto Domanda 6 (10%) Definire (con una opportuna notazione) su una relazione i vincoli che impongano le seguenti condizioni Retribuzioni(Matricola,Lordo,Imposte,StipNetto,Verifica) Il valore di Verifica è OK se e solo se StipNetto è uguale alla differenza fra Lordo e Imposte. Se il valore di Verifica è OK, allora StipNetto è uguale alla differenza fra Lordo e Imposte (si noti che in questo caso non si vuole invece imporre nessuna condizione se il valore di Verifica è diverso da OK ).
Basi di dati I 19 luglio 2018 Esame Compito B Durata: un ora e trenta minuti. Cognome: Nome: Matricola: Domanda 1 (15%) Considerare le seguenti relazioni (tutte senza valori nulli) Prodotti (Codice, Nome, Prezzo) Magazzini (Codice, Nome, Città) Giacenze (Prodotto, Magazzino, Quantità), con vincoli di integrità referenziale fra Prodotto e la chiave di Prodotti e fra Magazzino e la chiave di Magazzini Ordini (Codice, Prodotto, Quantità), con vincolo di integrità referenziale fra Prodotto e la chiave di Prodotti Siano le seguenti le cardinalità delle relazioni Prodotti: cardinalità C P = 2000 Magazzini: cardinalità C M = 20 Giacenze: cardinalità C G = 15.000 Ordini: cardinalità C O = 5000 Indicare la cardinalità del risultato di ciascuna delle seguenti interrogazioni SQL, specificando l intervallo nel quale essa può variare; indicare simboli e numeri. Min (simboli e valore) Max (simboli e valore) select prodotto, magazzino from giacenze join prodotti p on prodotto = p.codice where prezzo > 100 select p.codice as prodotto, m.codice as magazzino from prodotti p, magazzini m where prezzo > 100 select prodotto, magazzino from giacenze join prodotti p on prodotto = p.codice join magazzini m on magazzino = m.codice select o.codice as ordine, prodotto, nome, quantita from ordini o join prodotti p on prodotto = p.codice where quantita > 5
Basi di dati I 19 luglio 2018 Compito B Domanda 2 (15%) Considerare la seguente base di dati sullo schema mostrato nella domanda precedente: Prodotti Codice Nome Prezzo 1 FrigoFreddo 1000 2 LavaBene 800 3 StiroTutto 50 4 PilaLungaDurata 1 Giacenze Prodotto Magazzino Quantità 1 11 3 1 12 2 2 11 1 3 11 10 4 11 100 4 12 200 4 13 150 4 14 150 Magazzini Codice Nome Città 11 Milano Centro Milano 12 Milano Fiera Milano 13 Italia Centrale Roma 14 Sud Caserta Ordini Codice Prodotto Quantità 101 1 2 102 2 2 103 2 1 104 3 1 105 4 500 106 4 300 Mostrare il risultato di ciascuna delle interrogazioni seguenti 1. select p.codice, nome, sum(quantita) as quantitaordinata from prodotti p join ordini o on p.codice=prodotto group by p.codice, nome 2. select codice, nome from prodotti p from magazzini m from giacenze where prodotto = p.codice and magazzino = m.codice))
Basi di dati I 19 luglio 2018 Compito B Domanda 3 (20%) Con riferimento allo schema di base di dati utilizzato nelle domande precedenti, formulare le seguenti interrogazioni in SQL 1. Trovare gli ordini che possono essere interamente soddisfatti con la giacenza in un magazzino (per i quali cioè esiste un magazzino che abbia, per il prodotto ordinato nell ordine, una giacenza maggiore o uguale alla quantità ordinata). Mostrare codice e nome tanto del prodotto quanto del magazzino e le due quantità. 2. Trovare per ogni prodotto la quantità totale ordinata (cioè la somma delle quantità indicate nei vari ordini), mostrando codice del prodotto. 3. Trovare i magazzini che hanno giacenze (non è importante la quantità) di tutti i prodotti ordinati. Mostrare codice e nome dei magazzini.
Basi di dati I 19 luglio 2018 Compito B Domanda 4 (25%) Mostrare lo schema concettuale di una base di dati per un insieme di musei, secondo le seguenti specifiche. Ogni museo ha un nome, si trova in una città (della quale interessa anche la nazione, con relativa sigla) e ha una serie di sale, ognuna delle quali ha un nome e una dimensione. I musei espongono opere d arte, per ognuna delle quali interessano l autore (con codice, cognome, nome e nazione di nascita), l anno di esecuzione e la sala nella quale viene esposta (che si assume fissa: ogni opera si trova in una sala di un museo) Indicare almeno un identificatore per ogni entità (introducendo codici identificativi ogni volta lo si ritenga opportuno) e mostrare le cardinalità delle relationship
Basi di dati I 19 luglio 2018 Compito B Domanda 5 (10%) Con riferimento ad una relazione Impiegati(CF, Nome, Stipendio, TitoloDiStudio), scrivere le interrogazioni SQL che calcolano, per ciascun titolo di studio, lo stipendio medio degli impiegati che hanno tale titolo, nei due casi seguenti: si usa il valore nullo per indicare che lo stipendio non è noto si usa il valore 0 per indicare che lo stipendio non è noto Domanda 6 (10%) Definire (con una opportuna notazione) su una relazione i vincoli che impongano le seguenti condizioni Salari(Matricola,StipLordo,Trattenute,Netto,OK) Il valore di OK è OK se e solo se Netto è uguale alla differenza fra StipLordo e Trattenute. Se il valore di OK è OK, allora Netto è uguale alla differenza fra StipLordo e Trattenute (si noti che in questo caso non si vuole invece imporre nessuna condizione se il valore di OK è diverso da OK ).
Basi di dati I 19 luglio 2018 Esame Compito A Durata: un ora e trenta minuti. Possibili soluzioni Cognome: Nome: Matricola: Domanda 1 (15%) Considerare le seguenti relazioni (tutte senza valori nulli) Prodotti (Codice, Nome, Prezzo) Magazzini (Codice, Nome, Città) Giacenze (Prodotto, Magazzino, Quantità), con vincoli di integrità referenziale fra Prodotto e la chiave di Prodotti e fra Magazzino e la chiave di Magazzini Ordini (Codice, Prodotto, Quantità), con vincolo di integrità referenziale fra Prodotto e la chiave di Prodotti Siano le seguenti le cardinalità delle relazioni Prodotti: cardinalità C P = 2000 Magazzini: cardinalità C M = 20 Giacenze: cardinalità C G = 15.000 Ordini: cardinalità C O = 5000 Indicare la cardinalità del risultato di ciascuna delle seguenti interrogazioni SQL, specificando l intervallo nel quale essa può variare; indicare simboli e numeri. Min (simboli e valore) Max (simboli e valore) select prodotto, magazzino from giacenze join prodotti p on prodotto = p.codice C G 15.000 C G 15.000 select p.codice as prodotto, m.codice as magazzino from prodotti p, magazzini m C P C M 40.000 C P C M 40.000 select o.codice as ordine, prodotto, nome, quantita from ordini o join prodotti p on prodotto = p.codice where quantita > 5 0 0 C O 5000 select prodotto, magazzino from giacenze join prodotti p on prodotto = p.codice join magazzini m on magazzino = m.codice where prezzo > 100 0 0 C G 15.000
Basi di dati I 19 luglio 2018 Compito A Domanda 2 (15%) Considerare la seguente base di dati sullo schema mostrato nella domanda precedente: Prodotti Codice Nome Prezzo 1 FrigoFreddo 1000 2 LavaBene 800 3 StiroTutto 50 4 PilaLungaDurata 1 Giacenze Prodotto Magazzino Quantità 1 11 3 1 12 2 2 11 1 3 11 10 4 11 100 4 12 200 4 13 150 4 14 150 Magazzini Codice Nome Città 11 Milano Centro Milano 12 Milano Fiera Milano 13 Italia Centrale Roma 14 Sud Caserta Ordini Codice Prodotto Quantità 101 1 2 102 2 2 103 2 1 104 3 1 105 4 500 106 4 300 Mostrare il risultato di ciascuna delle interrogazioni seguenti 1. select codice, nome, sum(quantita) as giacenzatotale from prodotti join giacenze on codice=prodotto group by codice, nome 2. select codice, nome from magazzini m from prodotti p from giacenze where prodotto = p.codice and magazzino = m.codice))
Basi di dati I 19 luglio 2018 Compito A Domanda 3 (20%) Con riferimento allo schema di base di dati utilizzato nelle domande precedenti, formulare le seguenti interrogazioni in SQL 1. Trovare gli ordini che possono essere interamente soddisfatti con la giacenza in un magazzino (per i quali cioè esiste un magazzino che abbia, per il prodotto ordinato nell ordine, una giacenza maggiore o uguale alla quantità ordinata). Mostrare codice e nome tanto del prodotto quanto del magazzino e le due quantità. select o.codice as ordine, g.magazzino as codmagazzino, m.nome as magazzino, p.codice as codprodotto, p.nome as prodotto, o.quantita as quantitaordinata, g.quantita as quantitadisponibile from ordini o join giacenze g on o.prodotto = g.prodotto join prodotti p on o.prodotto = p.codice join magazzini m on g.magazzino =m.codice where o.quantita <= g.quantita 2. Trovare per ogni prodotto la giacenza totale (cioè la somma delle quantità disponibili nei vari magazzini); mostrare codice e giacenza totale. select prodotto, sum(quantita) as giacenzatotale from giacenze group by prodotto 3. Trovare i prodotti ordinati che hanno giacenze (non è importante la quantità) in tutti i magazzini. Mostrare codice e nome del prodotti. select distinct p.codice, nome from prodotti p join ordini o on p.codice = prodotto from magazzini m from giacenze where prodotto = p.codice and magazzino = m.codice))
Basi di dati I 19 luglio 2018 Compito A Domanda 4 (25%) Mostrare lo schema concettuale di una base di dati per un insieme di gallerie di pittura, secondo le seguenti specifiche. Ogni galleria ha un nome, si trova in una città (della quale interessa anche la nazione, con relativa sigla) e ha una serie di sale, ognuna delle quali ha un nome e una dimensione. Le gallerie espongono quadri, per ognuno dei quali interessano l autore (con codice, cognome, nome e nazione di nascita), l anno di esecuzione e la sala nella quale viene esposto (che si assume fissa: ogni quadro si trova in una sala di una galleria) Indicare almeno un identificatore per ogni entità (introducendo codici identificativi ogni volta lo si ritenga opportuno) e mostrare le cardinalità delle relationship Soluzione per il compito B, quella per l altro è molto simile
Basi di dati I 19 luglio 2018 Compito A Domanda 5 (10%) Con riferimento ad una relazione Cittadini(CF, Nome, Reddito, TitoloDiStudio), scrivere le interrogazioni SQL che calcolano, per ciascun titolo di studio, il reddito medio dei cittadini che hanno tale titolo, nei due casi seguenti: si usa il valore nullo per indicare che il reddito non è noto Soluzione SELECT Qualifica, AVG(Reddito) AS RedditoMedia FROM Cittadini GROUP BY Qualifica si usa il valore -1 per indicare che il reddito non è noto Soluzione SELECT Qualifica, AVG(Reddito) AS RedditoMedia FROM Cittadini WHERE Reddito <> -1 GROUP BY Qualifica Domanda 6 (10%) Definire (con una opportuna notazione) su una relazione i vincoli che impongano le seguenti condizioni Retribuzioni(Matricola,Lordo,Imposte,StipNetto,Verifica) Il valore di Verifica è OK se e solo se StipNetto è uguale alla differenza fra Lordo e Imposte. CHECK (( ((Verifica = OK ) ) AND (StipNetto = Lordo - Imposte) ) OR ( ((Verifica <> OK ) ) AND (StipNetto <> Lordo - Imposte) ) Se il valore di Verifica è OK, allora StipNetto è uguale alla differenza fra Lordo e Imposte (si noti che in questo caso non si vuole invece imporre nessuna condizione se il valore di Verifica è diverso da OK ). CHECK ( (NOT (Verifica = OK ) ) OR (StipNetto = Lordo - Imposte) )
Basi di dati I 19 luglio 2018 Esame Compito B Durata: un ora e trenta minuti. Possibili soluzioni Cognome: Nome: Matricola: Domanda 1 (15%) Considerare le seguenti relazioni (tutte senza valori nulli) Prodotti (Codice, Nome, Prezzo) Magazzini (Codice, Nome, Città) Giacenze (Prodotto, Magazzino, Quantità), con vincoli di integrità referenziale fra Prodotto e la chiave di Prodotti e fra Magazzino e la chiave di Magazzini Ordini (Codice, Prodotto, Quantità), con vincolo di integrità referenziale fra Prodotto e la chiave di Prodotti Siano le seguenti le cardinalità delle relazioni Prodotti: cardinalità C P = 2000 Magazzini: cardinalità C M = 20 Giacenze: cardinalità C G = 15.000 Ordini: cardinalità C O = 5000 Indicare la cardinalità del risultato di ciascuna delle seguenti interrogazioni SQL, specificando l intervallo nel quale essa può variare; indicare simboli e numeri. Min (simboli e valore) Max (simboli e valore) select prodotto, magazzino from giacenze join prodotti p on prodotto = p.codice where prezzo > 100 0 0 C G 15.000 select p.codice as prodotto, m.codice as magazzino from prodotti p, magazzini m where prezzo > 100 0 0 C P C M 40.000 select prodotto, magazzino from giacenze join prodotti p on prodotto = p.codice join magazzini m on magazzino = m.codice C G 15.000 C G 15.000 select o.codice as ordine, prodotto, nome, quantita from ordini o join prodotti p on prodotto = p.codice where quantita > 5 0 0 C O 5000
Basi di dati I 19 luglio 2018 Compito B Domanda 2 (15%) Considerare la seguente base di dati sullo schema mostrato nella domanda precedente: Prodotti Codice Nome Prezzo 1 FrigoFreddo 1000 2 LavaBene 800 3 StiroTutto 50 4 PilaLungaDurata 1 Giacenze Prodotto Magazzino Quantità 1 11 3 1 12 2 2 11 1 3 11 10 4 11 100 4 12 200 4 13 150 4 14 150 Magazzini Codice Nome Città 11 Milano Centro Milano 12 Milano Fiera Milano 13 Italia Centrale Roma 14 Sud Caserta Ordini Codice Prodotto Quantità 101 1 2 102 2 2 103 2 1 104 3 1 105 4 500 106 4 300 Mostrare il risultato di ciascuna delle interrogazioni seguenti 1. select p.codice, nome, sum(quantita) as quantitaordinata from prodotti p join ordini o on p.codice=prodotto group by p.codice, nome 2. select codice, nome from prodotti p from magazzini m from giacenze where prodotto = p.codice and magazzino = m.codice))
Basi di dati I 19 luglio 2018 Compito B Domanda 3 (20%) Con riferimento allo schema di base di dati utilizzato nelle domande precedenti, formulare le seguenti interrogazioni in SQL 1. Trovare gli ordini che possono essere interamente soddisfatti con la giacenza in un magazzino (per i quali cioè esiste un magazzino che abbia, per il prodotto ordinato nell ordine, una giacenza maggiore o uguale alla quantità ordinata). Mostrare codice e nome tanto del prodotto quanto del magazzino e le due quantità. select o.codice as ordine, g.magazzino as codmagazzino, m.nome as magazzino, p.codice as codprodotto, p.nome as prodotto, o.quantita as quantitaordinata, g.quantita as quantitadisponibile from ordini o join giacenze g on o.prodotto = g.prodotto join prodotti p on o.prodotto = p.codice join magazzini m on g.magazzino =m.codice where o.quantita <= g.quantita 2. Trovare per ogni prodotto la quantità totale ordinata (cioè la somma delle quantità indicate nei vari ordini), mostrando codice del prodotto. select prodotto, sum(quantita) as totaleordinato from ordini group by prodotto 3. Trovare i magazzini che hanno giacenze (non è importante la quantità) di tutti i prodotti ordinati. Mostrare codice e nome dei magazzini. select codice, nome from magazzini m from prodotti p from giacenze g join ordini o on g.prodotto = o.prodotto where o.prodotto = p.codice and magazzino = m.codice))
Basi di dati I 19 luglio 2018 Compito B Domanda 4 (25%) Mostrare lo schema concettuale di una base di dati per un insieme di musei, secondo le seguenti specifiche. Ogni museo ha un nome, si trova in una città (della quale interessa anche la nazione, con relativa sigla) e ha una serie di sale, ognuna delle quali ha un nome e una dimensione. I musei espongono opere d arte, per ognuna delle quali interessano l autore (con codice, cognome, nome e nazione di nascita), l anno di esecuzione e la sala nella quale viene esposta (che si assume fissa: ogni opera si trova in una sala di un museo) Indicare almeno un identificatore per ogni entità (introducendo codici identificativi ogni volta lo si ritenga opportuno) e mostrare le cardinalità delle relationship Soluzione per il compito B, quella per l altro è molto simile
Basi di dati I 19 luglio 2018 Compito B Domanda 5 (10%) Con riferimento ad una relazione Impiegati(CF, Nome, Stipendio, TitoloDiStudio), scrivere le interrogazioni SQL che calcolano, per ciascun titolo di studio, lo stipendio medio degli impiegati che hanno tale titolo, nei due casi seguenti: si usa il valore nullo per indicare che lo stipendio non è noto Soluzione SELECT Qualifica, AVG(Stipendio) AS StipendioMedia FROM Impiegati GROUP BY Qualifica si usa il valore 0 per indicare che lo stipendio non è noto Soluzione SELECT Qualifica, AVG(Stipendio) AS StipendioMedia FROM Impiegati WHERE Stipendio <> 0 GROUP BY Qualifica Domanda 6 (10%) Definire (con una opportuna notazione) su una relazione i vincoli che impongano le seguenti condizioni Salari(Matricola,StipLordo,Trattenute,Netto,OK) Il valore di OK è OK se e solo se Netto è uguale alla differenza fra StipLordo e Trattenute. CHECK (( ((OK = OK ) ) AND (Netto = StipLordo - Trattenute) ) OR ( ((OK <> OK ) ) AND (Netto <> StipLordo - Trattenute) ) Se il valore di OK è OK, allora Netto è uguale alla differenza fra StipLordo e Trattenute (si noti che in questo caso non si vuole invece imporre nessuna condizione se il valore di OK è diverso da OK ). CHECK ( (NOT (OK = OK ) ) OR (Netto = StipLordo - Trattenute) )