Sei sulla pagina 1di 27

Esercizi Query SQL

Basi di Dati e Sistemi Informativi

Corso di Laurea in Ing. Gestionale / Ing. Informatica e dell'Automazione

Prof. Ing. Eugenio Di Sciascio · Ing. Simona Colucci · Ing. Giuseppe Loseto

Lab. di Sistemi Informativi · Politecnico di Bari


Contenuti
Sono riportate di seguito una serie di interrogazioni riferite ad appelli di anni passati
(2007+). Ogni interrogazione è caratterizzata da:

schema relazionale sul quale deve essere eseguita


testo in linguaggio naturale dell'interrogazione richiesta
soluzione proposta definita in linguaggio SQL

Le soluzioni proposte hanno valore puramente didattico e potrebbero risultare non ottimizzate

per il particolare scenario applicativo. Risoluzioni alternative e ulteriori considerazioni sono


trattate durante le ore di lezione.

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 2


Appello 03-03-2007
PERCORSO (codice, gg_settimana_disponibile, N_fermate)
TRATTA (codice, citta_partenza, citta_arrivo, km_tratta)
TRATTA_PERCORSO (codPercorso, codTratta, N_tratta)

Q1. Selezionare i/il percorso più lungo.

SELECT *

FROM Percorso

WHERE codice = ( SELECT codPercorso

FROM Tratta JOIN Tratta_Percorso ON codice = codTratta

GROUP BY codPercorso

HAVING SUM(km_tratta) >= ALL ( SELECT SUM(km_tratta)

FROM Tratta, Tratta_Percorso

WHERE codice = codTratta

GROUP BY codPercorso ) )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 3


Appello 27-07-2007
TESSERATO (N_Tessera, nome, cognome, data_nascita)
PRENOTAZIONE (codice, N_biglietti, anno, mese, giorno, ora, codFilm, N_Tessera)
FILM (codice, nome, regista)

Q1. Estrarre i tesserati che ogni anno hanno prenotato un numero medio di biglietti superiore a 4.

SELECT *

FROM Tesserato

WHERE N_Tessera NOT IN ( SELECT distinct N_Tessera

FROM Prenotazione

GROUP BY N_tessera, anno

HAVING AVG(N_biglietti) <= 4 )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 4


Risoluzione alternativa

SELECT *

FROM Tesserato

WHERE N_Tessera IN ( SELECT distinct N_tessera

FROM Prenotazione AS P

WHERE 4 < ALL ( SELECT AVG(N_biglietti)

FROM Prenotazione

WHERE N_Tessera=P.N_tessera

GROUP BY anno ) )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 5


Appello 07-09-2007
CONCERTO (codice, titolo, esecutore, durata)
SALA (codice, nome, indirizzo, città, telefono)
PROGRAMMAZIONE (data_programmazione, cod_concerto, ora_inizio, N_posti_prenotati, cod_sala, prezzo_biglietto)

Q1. Calcolare l'incasso totalizzato da ciascun concerto.

SELECT cod_concerto, SUM(N_posti_prenotati*prezzo_biglietto) AS incasso

FROM Programmazione

GROUP BY cod_concerto

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 6


Appello 17-05-2008
CLIENTE (codCliente, nome, cognome)
ACQUISTO (codAcquisto, dataAcquisto, importo_totale, codCliente)

Q2. Estrarre gli acquisti con un importo totale superiore alla media del giorno.

SELECT *

FROM Acquisto A

WHERE importo_totale > ( SELECT AVG(importo_totale)

FROM Acquisto

WHERE dataAcquisto = A.dataAcquisto )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 7


Appello 24-11-2008
ISCRITTO (N_tessera, nome, cognome, data_iscrizione)
CORSO (codice, nome, ora_inizio, difficolta)
PARTECIPA (codCorso, N_tessera, gg_settimana)

Q2. Estrarre i corsi di difficoltà media che il sabato hanno una partecipazione più alta rispetto a
tutti gli altri giorni della settimana.

SELECT *

FROM Corso C

WHERE difficolta = 'media' AND

codice IN ( SELECT codCorso


FROM Partecipa P

WHERE gg_settimana = 'sabato'

GROUP BY codCorso

HAVING COUNT(*) >= ALL ( SELECT COUNT(*)

FROM Partecipa

WHERE codCorso = P.codCorso AND gg_settimana <> 'sabato'

GROUP BY gg_settimana ) )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 8


Appello 25-02-2009
PERSONA (N_tessera, nome, cognome, data_nascita)
COPPIA (N_tessera1, N_tessera2, data_costituzione)
GARA (N_tessera1, N_tessera2, anno_gara, mm_gara, gg_gara, ora_inizio, ora_fine, punteggio)

Q1. Estrarre per ciascuna coppia costituitasi dal 2006 il punteggio totalizzato ogni anno. I risultati
devono essere ordinati per punteggio totale decrescente.

SELECT N_tessera1, N_tessera2, anno_gara, SUM(punteggio) AS TOT

FROM Coppia NATURAL JOIN Gara

WHERE data_costituzione >= '01/01/2006'

GROUP BY N_tessera1, N_tessera2, anno_gara

ORDER BY TOT DESC

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 9


Appello 03-05-2010
REPERTO (Ninventario, nome, descrizione, datazione, materiale, cf_responsabile)
FOTO (codice, nome, descrizione, data, Ninventario)
PERSONALE (cf, nome, cognome, anni_esperienza)

Q1. Estrarre il personale che abbia lavorato come responsabile di reperti di metallo con datazione
tardo antica oppure di reperti con almeno 10 foto.

SELECT *

FROM Personale

WHERE cf IN ( SELECT distinct cf_responsabile

FROM Reperto

WHERE materiale = 'metallo' AND datazione = 'tarda antica' )

OR cf IN ( SELECT distinct cf_responsabile

FROM Reperto

WHERE Ninventario IN ( SELECT Ninventario

FROM Foto

GROUP BY Ninventario

HAVING COUNT(*) >= 10 ) )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 10


Risoluzione alternativa

Utilizzare una sub-query differente per imporre la seconda condizione

SELECT *

FROM Personale

WHERE cf IN ( SELECT distinct cf_responsabile

FROM Reperto

WHERE materiale = 'metallo' AND datazione = 'tarda antica' )

OR cf IN ( SELECT distinct cf_responsabile

FROM Reperto NATURAL JOIN Foto

GROUP BY cf_responsabile, Ninventario

HAVING count(*) >= 10 )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 11


Appello 30-09-2010
AGENZIA (ABI, CAB, indirizzo, citta, tel)
TITOLARE (CF, nome, cognome, data_nascita, indirizzo_residenza)
CONTOCORRENTE (ABI, CAB, numero, data_apertura, cf_titolare)
ESTRATTOCONTO (ABI, CAB, numero, data_estrazione, saldo)

Q1. Estrarre per ciascun titolare i dati dell’ultimo estratto conto.

SELECT cf_titolare, ES.*

FROM Contocorrente NATURAL JOIN Estrattoconto ES

WHERE (CF_titolare, data_estrazione) IN

( SELECT cf_titolare, MAX(data_estrazione)

FROM Contocorrente NATURAL JOIN Estrattoconto

GROUP BY cf_titolare )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 12


Appello 22-11-2011
ARTISTA (cf, nome, cognome)
ALBUM (codiceSIAE, titolo, tipo, data_pubblicazione, cf_artista)
CLASSIFICA (anno, mese, codiceAlbum, posizione, copie_vendute)

Q1. Selezionare gli artisti che hanno avuto nel 2010 un numero medio di copie vendute superiore
a 100.

SELECT *

FROM Artista

WHERE cf IN ( SELECT cf_artista

FROM Album JOIN Classifica ON codiceSIAE = codice Album

WHERE anno = 2010

GROUP BY cf_artista

HAVING AVG(copie_vendute) > 100 )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 13


Q2. Selezionare gli album che nello stesso anno sono stati almeno 2 volte in classifica in prima
posizione.

SELECT *

FROM Album

WHERE codiceSIAE IN ( SELECT codiceAlbum

FROM Classifica

WHERE posizione = 1

GROUP BY codiceAlbum, anno

HAVING count(*) >= 2 )

Risoluzione alternativa: utilizzare un self join

SELECT *

FROM Album

WHERE codiceSIAE IN ( SELECT distinct C1.codiceAlbum

FROM Classifica C1, Classifica C2

WHERE C1.codiceAlbum = C2.codiceAlbum

AND C1.anno = C2.anno AND C1.mese <> C2.mese

AND C1.posizione = 1 AND C2.posizione = 1 )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 14


Cineasts Movie Database
Porting relazione del dataset NoSQL cineasts_12k_movies_50k_actors.

Il dataset include ~12k Film, ~ 45 Attori, ~95 relazioni Interpreta (Attore → Interpreta → Film)
FILM (codFilm, titolo, anno, genere, durata, incasso, voto)
ATTORE (codAttore, nome, cognome, nazionalita)
INTERPRETA (codFilm, codAttore, compenso, ruolo)

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 15


Appello 16-07-2015

Q1. Visualizzare i film che presentino nel cast almeno 10 attori con compenso superiore a 10.000.

SELECT *

FROM Film

WHERE codFilm IN ( SELECT codFilm

FROM Interpreta

WHERE compenso > 10000

GROUP BY codFilm

HAVING COUNT(*) >= 10 )

Q2. Selezionare per ogni attore il numero di film in cui ha partecipato, visualizzando i risultati in
ordine decrescente sulla base di tale valore.

SELECT codAttore, COUNT(*) AS num_film

FROM Interpreta

GROUP BY codAttore

ORDER BY num_film DESC

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 16


Appello 02-09-2015

Q1. Visualizzare in ordine alfabetico i film in cui sono presenti sia Brad Pitt che Matt Damon.

SELECT *

FROM Film

WHERE codFilm IN ( SELECT codFilm

FROM Interpreta NATURAL JOIN Attore

WHERE nome = 'Brad' and cognome = 'Pitt' )

AND codFilm IN ( SELECT codFilm

FROM Interpreta NATURAL JOIN Attore

WHERE nome = 'Matt' and cognome = 'Daemon' )

ORDER BY titolo

Q2. Selezionare per ogni attore la somma dei compensi ottenuti nel 2015.

SELECT codAttore, SUM(compenso)

FROM Interpreta NATURAL JOIN Film

WHERE anno = 2015

GROUP BY codAttore

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 17


Appello 22-09-2015

Q1. Visualizzare gli attori italiani che hanno partecipato ad almeno 10 film.

SELECT codAttore

FROM Interpreta NATURAL JOIN Attore

WHERE nazionalita = 'italiana'

GROUP BY codAttore

HAVING COUNT(*) >= 10

Q2. Selezionare i film in cui non è presente Johnny Depp.

SELECT *

FROM Film

WHERE codFilm NOT IN ( SELECT codFilm

FROM Interpreta NATURAL JOIN Attore

WHERE nome = 'Johnny' AND cognome = 'Depp' )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 18


Appello 12-11-2015

Q1. Visualizzare, per ciascun attore, il film che ha ottenuto l'incasso maggiore.

SELECT codAttore, codFilm

FROM Interpreta I NATURAL JOIN Film

WHERE incasso = ( SELECT MAX(incasso)

FROM Interpreta NATURAL JOIN Film

WHERE codAttore = I.codAttore )

Q2. Visualizzare i film in cui siano presenti sia attori francesi che italiani.

SELECT *

FROM Film

WHERE codFilm IN ( SELECT distinct codFilm


FROM Interpreta NATURAL JOIN Attore

WHERE nazionalita = 'italiana' )

AND codFilm IN ( SELECT distinct codFilm

FROM Interpreta NATURAL JOIN Attore

WHERE nazionalita = 'francese' )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 19


Appello 05-02-2016

Q1. Selezionare, per ogni anno, l'incasso medio ed il numero di film realizzati visualizzandoli in
ordine decrescente rispetto a tale valore.

SELECT anno, AVG(incasso) AS incasso_medio, COUNT(*) AS num_film

FROM Film

GROUP BY anno

ORDER BY num_film DESC

Q2. Visualizzare gli attori che nel 2015 hanno ottenuto il compenso maggiore e minore.

SELECT codAttore

FROM Interpreta NATURAL JOIN Film

WHERE anno = 2015 AND

( compenso = ( SELECT MAX(compenso)

FROM Interpreta NATURAL JOIN Film

WHERE anno = 2015 )

OR compenso = ( SELECT MIN(compenso)


FROM Interpreta NATURAL JOIN Film

WHERE anno = 2015 ) )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 20


Appello 18-02-2016

Q1. Selezionare, per ogni film con incasso maggiore di un milione, il compenso medio degli attori
che vi hanno recitato.

SELECT codFilm, AVG(compenso)

FROM Interpreta NATURAL JOIN Film

WHERE incasso > 1000000

GROUP BY codFilm

Q2. Visualizzare i film di genere drammatico in cui non siano presenti attori italiani.

SELECT *

FROM Film

WHERE genere = 'drammatico' AND codFilm NOT IN ( SELECT distinct codFilm

FROM Interpreta NATURAL JOIN Attore

WHERE nazionalita = 'italiana' )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 21


Appello 20-04-2016

Q1. Selezionare gli attori che abbiano recitato in almeno 5 film con incasso maggiore di 1 milione.

SELECT codAttore

FROM Interpreta NATURAL JOIN Film

WHERE incasso > 1000000

GROUP BY codAttore

HAVING COUNT(*) >= 5

Q2. Visualizzare i film in cui Harrison Ford ha ricevuto il compenso maggiore e minore.

SELECT codFilm
FROM Interpreta NATURAL JOIN Attore

WHERE nome = 'Harrison' AND cognome = 'Ford' AND

( compenso = ( SELECT MAX(compenso)

FROM Interpreta NATURAL JOIN Attore

WHERE nome = 'Harrison' AND cognome = 'Ford' )

OR compenso = ( SELECT MIN(compenso)

FROM Interpreta NATURAL JOIN Attore

WHERE nome = 'Harrison' AND cognome = 'Ford' ) )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 22


Appello 17-06-2016

Q1. Visualizzare gli attori che hanno ricoperto lo stesso ruolo in almeno due film differenti.

SELECT distinct codAttore

FROM Interpreta

GROUP BY codAttore, ruolo

HAVING COUNT(*) > 1

Q2. Visualizzare, con ordinamento decrescente in base al voto, i film con un incasso superiore al
doppio del compenso complessivo del proprio cast.

SELECT *

FROM Film F

WHERE incasso > 2 * ( SELECT SUM(compenso)

FROM Interpreta

WHERE codFilm = F.codFilm )

ORDER BY voto DESC

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 23


Risoluzione alternativa Q1

Utilizzare un self join

SELECT distinct I1.codAttore

FROM Interpreta I1, Interpreta I2

WHERE I1.codAttore = I2.codAttore

AND I1.ruolo = I2.ruolo

AND I1.codFilm <> I2.codFilm

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 24


Appello 18-07-2016

Q1. Visualizzare gli attori che hanno ricoperto lo stesso ruolo in tutti i film in cui hanno recitato.

SELECT codAttore

FROM Interpreta

GROUP BY codAttore

HAVING COUNT(distinct ruolo) = 1

Risoluzione alternativa: utilizzare un self join

SELECT *

FROM Attore

WHERE codAttore NOT IN (

SELECT I1.codAttore

FROM Interpreta I1, Interpreta I2

WHERE I1.codAttore = I2.codAttore

AND I1.codFilm <> I2.codFilm

AND I1.ruolo <> I2.ruolo

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 25


Appello 10-11-2016

Q1. Visualizzare gli attori che, ogni anno, hanno recitato in almeno un film.

SELECT *

FROM Attore

WHERE codAttore NOT IN (

SELECT codAttore

FROM Interpreta I NATURAL JOIN Film F

WHERE NOT EXISTS ( SELECT *

FROM Interpreta NATURAL JOIN Film

WHERE codAttore = I.codAttore AND anno = F.anno – 1 )

AND anno <> ( SELECT MIN(anno)

FROM Interpreta NATURAL JOIN Film

WHERE codAttore = I.codAttore )

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 26


Contatti & Info

Prof. Ing. Eugenio Di Sciascio eugenio.disciascio@poliba.it

Ing. Simona Colucci simona.colucci@poliba.it

Ing. Giuseppe Loseto giuseppe.loseto@poliba.it

Lab. di Sistemi Informativi · Politecnico di Bari

Questo documento è distribuito con licenza Creative Commons Attribution-NoDerivatives


4.0 International (CC BY-ND 4.0).

Esercizi Query SQL - Corso di Basi di Dati e Sistemi Informativi 27

Potrebbero piacerti anche