Basi di Dati Esercizi di SQL (1)
Transcript
Basi di Dati Esercizi di SQL (1)
Basi di Dati Esercizi di SQL (1) - Soluzioni 1 - Sia dato lo schema relazionale costituito dalle tabelle (le chiavi primarie sono sottolineate): RIVISTA (CodR, NomeR, Editore) ARTICOLO (CodA, Titolo, Argomento, CodR) Facendo riferimento alla base di dati presentata risolvere le seguenti interrogazioni SQL. (a) Trovare gli editori che hanno pubblicato almeno 1 articolo di argomento 'motociclismo'. SELECT DISTINCT Editore FROM Rivista R, Articolo A WHERE R.CodR=A.CodR AND Argomento = 'motociclismo' oppure SELECT DISTINCT Editore FROM Rivista WHERE CodR IN (SELECT CodR FROM Articolo WHERE Argomento = 'motociclismo') oppure SELECT DISTINCT Editore FROM Rivista R WHERE EXISTS (SELECT * FROM Articolo A WHERE Argomento = 'motociclismo' AND A.CodR = R.CodR) (b) Trovare il nome delle riviste che non hanno mai pubblicato articoli di argomento 'motociclismo'. SELECT DISTINCT NomeR FROM Rivista WHERE CodR NOT IN (SELECT CodR FROM Articolo WHERE Argomento = 'motociclismo') oppure SELECT DISTINCT NomeR FROM Rivista WHERE NOT EXISTS (SELECT * FROM Articolo WHERE R.CodR=A.CodR AND Argomento = 'motociclismo') (c) Trovare gli editori che non hanno mai pubblicato articoli di argomento 'motociclismo'. SELECT DISTINCT Editore FROM Rivista WHERE Editore NOT IN (SELECT Editore FROM Rivista R, Articolo A WHERE R.CodR=A.CodR AND Argomento = 'motociclismo') oppure SELECT DISTINCT Editore FROM Rivista R1 WHERE NOT EXISTS (SELECT * FROM Rivista R2, Articolo A WHERE R2.CodR=A.CodR AND Argomento = 'motociclismo' AND R2.Editore=R1.Editore) (d) Trovare i nomi delle riviste che hanno pubblicato solo articoli di motociclismo. SELECT DISTINCT NomeR FROM Rivista R, Articolo A WHERE R.CodR=A.CodR AND CodR NOT IN (SELECT CodR FROM Articolo WHERE Argomento <> 'motociclismo') (e) Trovare i nomi delle riviste che hanno pubblicato articoli di motociclismo oppure di auto. SELECT DISTINCT NomeR FROM Rivista R, Articolo A WHERE R.CodR=A.CodR AND (Argomento = 'motociclismo' OR Argomento = 'automobilismo') (f) Trovare i nomi delle riviste che hanno pubblicato articoli sia di motociclismo che di auto. SELECT DISTINCT NomeR FROM Rivista R, Articolo A WHERE R.CodR=A.CodR AND Argomento = 'motociclismo' AND R.CodR IN (SELECT CodR FROM Articolo A WHERE Argomento = 'automobilismo') (g) Trovare gli editori che hanno pubblicato almeno 2 articoli di motociclismo. SELECT Editore FROM Rivista R, Articolo A WHERE R.CodR=A.CodR AND Argomento = 'motociclismo' GROUP BY Editore HAVING COUNT(*) > 1 (h) Trovare gli editori che hanno pubblicato almeno una rivista che ha pubblicato almeno 2 articoli di motociclismo. SELECT DISTINCT Editore FROM Rivista R, Articolo A WHERE R.CodR=A.CodR AND Argomento = 'motociclismo' GROUP BY CodR, Editore HAVING COUNT(*) > 1 2 - Sia dato lo schema relazionale costituito dalle tabelle (le chiavi primarie sono sottolineate): IMPIEGATO (Cognome, Nome, CodDip, Stipendio) DIPARTIMENTO (CodDip, Denominazione, Citta') Facendo riferimento alla base di dati presentata risolvere le seguenti interrogazioni SQL. (a) Selezionare i codici dei dipartimenti che spendono piu' di 100 milioni in stipendi, ordinati in ordine alfabetico. SELECT CodDip FROM Impiegato GROUP BY CodDip HAVING SUM(Stipendio) > 100.000.000 ORDER BY CodDip (b) Per ogni dipartimento di Torino, selezionare il codice del dipartimento e lo stipendio medio. SELECT CodDip, AVG(Stipendio) FROM Impiegato I, Dipartimento D WHERE I.CodDip = D.CodDip AND Citta' = 'Torino' GROUP BY CodDip (c) Selezionare il codice del dipartimento e il massimo stipendio per ogni dipartimento di Torino che spende piu' di 100 milioni in stipendi. SELECT CodDip, MAX(Stipendio) FROM Impiegato I, Dipartimento D WHERE I.CodDip = D.CodDip AND Citta' = 'Torino' GROUP BY CodDip HAVING SUM(Stipendio) > 100.000.000 (d) Selezionare le denominazioni dei dipartimenti con piu' di 100 impiegati. SELECT Denominazione FROM Impiegato I, Dipartimento D WHERE I.CodDip = D.CodDip GROUP BY CodDip, Denominazione HAVING COUNT(*) > 100 (e) Selezionare i codici e le denominazioni dei dipartimenti che emettono solo stipendi maggiori di 10.000. SELECT CodDip, Denominazione FROM Impiegato I, Dipartimento D WHERE I.CodDip = D.CodDip AND I.CodDip NOT IN (SELECT CodDip FROM Impiegato WHERE Stipendio < 10000) oppure SELECT CodDip, Denominazione FROM Dipartimento D WHERE NOT EXISTS (SELECT * FROM Impiegato I WHERE I.CodDip=D.CodDip AND Stipendio < 10000) (f) Selezionare i cognomi degli impiegati che ricevono uno stipendio maggiore della media degli stipendi del loro dipartimento. SELECT Cognome FROM Impiegato I1 WHERE Stipendio > (SELECT AVG(Sipendio) FROM Impiegato I2 WHERE I2.CodDip=I1.CodDip) (g) Selezionare il codice del dipartimento in cui lavorano sia Rossi che Bianchi. SELECT CodDip FROM Impiegato WHERE Cognome='Rossi' AND CodDip IN (SELECT CodDip FROM Impiegato WHERE Cognome='Bianchi') oppure SELECT CodDip FROM Impiegato I1 WHERE Cognome='Rossi' AND EXISTS (SELECT * FROM Impiegato I2 WHERE Cognome='Bianchi' AND I1.CodDip=I2.CodDip)