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)