S Q L E S E R C I Z I 1. Sia dato il seguente schema relazionale: GIOCATORE(CodGiocatore, Nome, RuoloIdeale) SQUADRA(CodSquadra, Nome, Citt`a) GIOCA IN(CodGiocatore,CodSquadra, Anno, Ruolo) (a) Visualizzare i nomi dei giocatori che hanno militato nel Torino dal 1930 al 1949, nel ruolo di ala destra. 2. Sia dato il seguente schema relazionale: AUTO(Targa, Marca, Cilindrata) POLIZZA(CodicePolizza, DataInizio, DataFine, Premio, Targa) INCIDENTE(Targa, Data,Ora, Luogo) (a) Visualizzare, in ordine decrescente rispetto alla cilindrata, tutte le auto che sono state coinvolte in un incidente a Torino negli anni 1980-1995. 3. Sia dato il seguente schema relazionale: ATLETA(CodAtleta, Nome, Nazione, Statura, Peso, DataNascita) FINALE(CodAtleta, CodSpecialita, Prestazione) SPECIALITA(CodSpecialita, NomeSpecialita) (a) Visualizzare gli atleti italiani che hanno partecipato alla finale dei 100m o dei 200m. (b) Visualizzare i nomi degli atleti di nazionalit`a italiana partecipanti alla finale in pi `u di una specialit`a. (c) Visualizzare i nomi degli atleti partecipanti alla finale dei 100m piani che abbiano corso tale gara in un tempo inferiore ai 10 2 e abbiano una statura inferiore alla media degli atleti contenuti nel database e peso superiore a quello dell atleta statunitense pi `u pesante. 4. Sia dato il seguente schema relazionale: LP(CodLP, Titolo, CodAutore, Anno, CasaDiscografica) AUTORE(CodAutore, Nome) (a) Visualizzare l anno di registrazione dell LP Nuvole di F. de Andr e. (b) Visualizzare il titolo degli LP registrati dai Pearl Jam dal 1990 in avanti. 5. Sia dato il seguente schema relazionale: LAVORA-IN(CodImpiegato, CodUfficio) IMPIEGATO(CodImpiegato, Nome, Titolo, Stipendio) (a) Visualizzare nome e codice di tutti gli impiegati che percepiscono uno stipendio mensile superiore ai 2.000.000 di lire. (b) Visualizzare il nome e il codice di tutti gli impiegati che condividono l ufficio con il Rag. Fantozzi.
6. Sia dato il seguente schema relazionale: STUDENTI(Matr, Nome, AnnoIscr) ESAMI(CodCorso, Matr, Data, Voto) PIANO-STUDI(Matr, CodCorso, Anno) (a) Visualizzare il nome e la media di tutti gli studenti iscritti negli anni 1993 e successivi che abbiano superato almeno 15 esami, ma nessun esame con voto pari a 18/30, e la cui media sia superiore a 25/30. 7. Sia dato il seguente schema relazionale: ISCRITTO(CodicePersona, Nome, Indirizzo) PRATICA(CodicePersona, CodiceSport, CodicePalestra) (a) Visualizzare nome e indirizzo delle persone che praticano tennis o basket presso la palestra ACME. (b) Visualizzare il nome delle persone e il codice della palestra frequentata per coloro che praticano soltanto basket. 8. Sia dato il seguente schema relazionale: TRENO(CodTreno, Modello, Capienza) TRATTA(CodTreno, NomeCittaPart, NomeCittaArr, OraPart, OraArr) (a) Visualizzare il modello dei treni in servizio sull intera tratta Torino-Milano che hanno una capienza di almeno 500 posti. (b) Visualizzare il modello dei treni in servizio sull intera tratta Torino-Milano dopo le 12.00 che hanno una capienza maggiore della capienza media dei treni in servizio sulla tratta Milano- Verona prima delle 21.00. 9. Sia dato il seguente schema relazionale: FILM(CodFilm, Titolo, Anno, Pellicola, Lingua, Genere) RECITA IN(CodPersona, CodFilm, Nome) DIRIGE(CodPersona, CodFilm, Nome) (a) Visualizzare i nomi delle persone che sono state contemporaneamente attore e regista di uno stesso film, a partire dal 1968, in film horror girati in tedesco. (b) Visualizzare i nomi dei registi che hanno recitato in almeno un film (anche diversi da quelli da loro diretti) e che hanno sempre utilizzato una pellicola 35mm. 10. Sia dato il seguente schema relazionale: MARITO(CodMarito, Nome, DataNascita, LuogoNascita) MOGLIE(CodMoglie, Nome, DataNascita, LuogoNascita) SPOSATI(CodMarito,CodMoglie, Data, Luogo) (a) Visualizzare i nomi degli ultrasessantenni (uomini e donne) che si sono risposati almeno 3 volte.
11. Sia dato il seguente schema relazionale: RADIO(CodRadio, Nome) FREQUENZA(CodRadio,Valore) TRASMETTE(CodRadio,NomeProgramma) (a) Visualizzare i nomi delle radio che trasmettono il medesimo programma. 12. Sia dato il seguente schema relazionale: PROGRAMMATORE(CodProgrammatore, Nome) MODULO(CodModulo, NomeProgetto, Linguaggio, N Linee) LAVORA A(CodProgrammatore, CodModulo) (a) Visualizzare il nome dei programmatori che hanno lavorato al progetto IRISI e il cui nome inizia con la lettera R. (b) Visualizzare il nome dei programmatori che hanno utilizzato il linguaggio Java in esattamente due progetti diversi e abbiano sviluppato almeno 10.000 linee di codice complessivamente. 13. Sia dato il seguente schema relazionale: OGGETTO(CodO, NomeO, Funzione, Costo) DESIGNER(CodD, NomeD, DataN, Citta) PROGETTA(CodO, CodD, Data) Esprimere in SQL le seguenti interrogazioni: (a) Visualizzare funzione e costo medio di tutti gli oggetti progettati da Pininfarina dal 1975 in avanti. (b) Ipotizzando che ogni oggetto possa essere progettato insieme da pi `u di un designer, visualizzare codice e nome di tutte le sedie che sono state progettate soltanto da designer nati dopo il 1968.
SOLUZIONI 1. (a) SELECT DISTINCT Giocatore.Nome FROM Giocatore AS G, Squadra AS S, GiocaIn AS GI WHERE GI.CodGiocatore = G.CodGiocatore AND GI.CodSquadra = S.CodSquadra AND S.Nome = "Torino" AND Ruolo = "Ala destra" AND Anno >= 1930 AND Anno <= 1949; 2. (a) SELECT DISTINCT Auto.* FROM Auto AS A, Incidente AS I WHERE A.Targa = I.Targa AND Luogo = "Torino" AND (Data >= 1/1/1985 AND Data =< 31/12/1995) ORDER BY Cilindrata DESC; 3. (a) SELECT DISTINCT Atleta.* FROM Atleta AS A, Finale AS F, SPECIALITA AS S WHERE (NomeSpecialita = "100m" OR NomeSpecialita = "200m") AND Nazione = "Italia" AND A.CodAtleta = F.CodAtleta AND F.CodSpecialita = S.CodSpecialita; (b) SELECT Nome FROM Atleta AS A, Finale AS F WHERE A.CodAtleta = F.CodAtleta AND Nazione = "Italia" GROUP BY Nome, CodAtleta HAVING COUNT(*) > 1; (c) SELECT DISTINCT A.Nome FROM Atleta AS A, Finale AS F, SPECIALITA AS S WHERE A.CodAtleta = F.CodAtleta AND F.CodSpecialita = S.CodSpecialita AND NomeSpecialita = "100m" AND Prestazione =< 10"2 AND Statura < (SELECT AVG(Statura) FROM Atleta) AND Peso > (SELECT MAX(Peso) FROM Atleta WHERE Nazione = "USA"); 4. (a) SELECT Anno FROM LP, Autore WHERE Titolo = "Nuvole" AND Nome = "De Andre " AND LP.CodAutore = Autore.CodAutore; (b) SELECT Titolo FROM LP, Autore WHERE Nome = "Pearl Jam" AND LP.CodAutore = Autore.CodAutore; AND Anno >= 1990; 5. (a) SELECT Nome, CodImpiegato FROM Impiegato AS I WHERE Stipendio > 2.000.000; (b) SELECT Nome, CodImpiegato FROM Impiegato WHERE Nome <> "Fantozzi" AND CodImpiegato IN (SELECT CodImpiegato FROM LavoraIn WHERE CodUfficio = (SELECT CodUfficio FROM LavoraIn AS L, Impiegato AS I WHERE Nome = "Fantozzi" AND Titolo = "Rag." AND L.CodImpiegato = I.CodImpiegato)) L interrogazione (equivalente) con il join: SELECT I2.Nome, I2.CodImpiegato FROM Impiegato AS I1, Impiegato AS I2 LavoraIn AS L1, LavoraIn AS L2 WHERE I1.Nome = "Fantozzi" AND I2.Nome <> "Fantozzi" AND I1.Titolo = "Rag." AND I1.CodImpiegato = L1.CodImpiegato AND L1.CodUfficio = L2.CodUfficio
AND L2.CodImpiegato = I2.CodImpiegato; In pratica, I1 e L1 sono impiegate per determinare l ufficio di Fantozzi, mentre I2 e L2 sono impiegate per trovare i nomi dei suoi compagni di ufficio. 6. (a) SELECT Nome, AVG(Voto) FROM Studenti, Esami WHERE AnnoIscr >= 1993 AND Studenti.Matr = Esami.Matr AND Matr NOT IN (SELECT Matr FROM Esame WHERE Voto = 18) GROUP BY Matr, Nome HAVING COUNT(*) >= 15 AND AVG(Voto) > 25; 7. (a) SELECT DISTINCT Nome, Indirizzo FROM Iscritto, Pratica WHERE Iscritto.CodicePersona = Pratica.CodicePersona AND CodicePalestra = "ACME" AND (CodiceSport = "Tennis" OR CodiceSport = "Basket"); (b) SELECT Nome, CodicePalestra FROM Iscritto, Pratica WHERE Iscritto.CodicePersona = Pratica.CodicePersona AND CodiceSport = "Basket" AND CodicePersona NOT IN (SELECT CodicePersona FROM Pratica WHERE CodiceSport <> "Basket"); 8. (a) SELECT DISTINCT Modello FROM Treno, Tratta WHERE Treno.CodTreno = Tratta.CodTreno AND NomeCittaPart = "Torino" AND NomeCittaArr = "Milano" AND Capienza >= 500; (b) SELECT DISTINCT Modello FROM Treno, Tratta WHERE Treno.CodTreno = Tratta.CodTreno AND NomeCittaPart = "Torino" AND NomeCittaArr = "Milano" AND OraPart >= 12:00 AND Capienza >= (SELECT AVG(Capienza) FROM Treno, Tratta WHERE Treno.CodTreno = Tratta.CodTreno AND NomeCittaPart = "Milano AND NomeCittaArr = "Verona" AND OraPart =< 22:00); 9. (a) SELECT DISTINCT Nome FROM RecitaIn, Dirige, Film WHERE RecitaIn.CodPersona = Dirige.CodPersona AND RecitaIn.CodFilm = Dirige.CodFilm AND Lingua = "Tedesco" AND Anno > 1968 AND Genere = "Horror"; (b) SELECT Nome FROM RecitaIn WHERE CodPersona IN (SELECT CodPersona FROM Dirige) AND CodPersona NOT IN (SELECT CodPersona FROM Film, Dirige WHERE Film.CodFilm = Dirige.CodFilm AND Pellicola <> "35mm"); 10. (a) SELECT Nome FROM Marito, Sposati WHERE DataNascita.year > 1999-60 AND Marito.CodMarito = Sposati.CodMarito GROUP BY Marito.CodMarito, Nome HAVING COUNT(*) >= 3 UNION SELECT Nome FROM Moglie, Sposati WHERE DataNascita.year > 1999-60
AND Moglie.CodMoglie = Sposati.CodMoglie GROUP BY Moglie.CodMoglie, Nome HAVING COUNT(*) >= 3 11. (a) SELECT Nome FROM Radio WHERE CodRadio IN (SELECT CodRadio FROM Trasmette AS T1, Trasmette AS T2 WHERE T1.NomeProgramma = T2.NomeProgramma AND T1.CodRadio <> T2.CodRadio); 12. (a) SELECT Nome FROM Programmatore WHERE Nome LIKE "R%" AND CodProgrammatore IN (SELECT CodProgrammatore FROM Lavora_A, Modulo WHERE Lavora_A.CodModulo = Modulo.CodModulo AND NomeProgetto = "IRISI"); (b) SELECT Nome FROM Programmatore AS P JOIN Lavora_A AS L ON P.CodProgrammatore = L.CodProgrammatore JOIN Modulo AS M ON M.CodModulo = L.CodModulo WHERE Linguaggio = "Java" GROUP BY CodProgrammatore, Nome HAVING COUNT(DISTINCT NomeProgetto) = 2 AND SUM(N_Linee) >= 10000; 13. (a) SELECT Funzione, AVG(Costo) FROM Oggetto AS O, Progetta AS P, Designer AS D WHERE O.CodO = P.CodO AND D.CodD = P.CodD AND Data >= 1975 AND NomeD = "Pininfarina" GROUP BY Funzione; (b) SELECT CodO, NomeO FROM Oggetto O WHERE Funzione = "Sedia" AND CodO NOT IN (SELECT CodO FROM Progetta AS P, Designer AS D WHERE P.CodD = D.CodD AND DataN <= 1968);