Esercitazione
Giugno-Pulvirenti AA 2005-2006 Esercitazione 1 Dato il seguente schema relazionale per modellare un torneo di calcio: giocatori( id_giocatore, nome, cognome, eta, id_squadra, ruolo) squadre( id_squadra, nome, citta) calendario( id_partita, id_sq_casa, id_sq_ospite, data) gol( id_partita, id_giocatore, minuto) Il campo id_sq_casa indica l’id della squadra che gioca in casa, mentre id_sq_ospite è quello della squadra ospite (fuori casa). Il campo ruolo nella tabella giocatore indica il ruolo del giocatore: ‘portiere’, ‘terzino’, ‘attaccante’, ecc. Il campo minuto indica il minuto di gioco della partita quando è stato segnato il gol. Nota: Le query possono avere più soluzioni. Si presenta per ogni query una solo risposta. Giugno-Pulvirenti AA 2005-2006
Giugno-Pulvirenti AA 2005-2006 Esercitazione 1 giocatori( id_giocatore, nome, cognome, eta, id_squadra, ruolo) squadre( id_squadra, nome, citta) calendario( id_partita, id_sq_casa, id_sq_ospite, data) gol( id_partita, id_giocatore, minuto) Per il giorno ‘15/05/2005’, per ogni squadra mostrare l’elenco dei gol fatti indicando, per ogni gol, il giocatore che ha segnato il gol ed il minuto di gioco. SELECT squadre.nome, gol.* FROM squadre NATURAL JOIN giocatori NATURAL JOIN calendario NATURAL JOIN gol WHERE data = ’15/05/2005’ ORDER BY squadre.nome, gol.minuto Giugno-Pulvirenti AA 2005-2006
Giugno-Pulvirenti AA 2005-2006 Esercitazione 1 giocatori( id_giocatore, nome, cognome, eta, id_squadra, ruolo) squadre( id_squadra, nome, citta) calendario( id_partita, id_sq_casa, id_sq_ospite, data) gol( id_partita, id_giocatore, minuto) Nome e Cognome dei centrocampisti che hanno segnato almeno un gol in tutto il campionato. SELECT nome, cognome FROM giocatori NATURAL JOIN gol WHERE ruolo = ‘centrocampista’ Giugno-Pulvirenti AA 2005-2006
Giugno-Pulvirenti AA 2005-2006 Esercitazione 1 giocatori( id_giocatore, nome, cognome, eta, id_squadra, ruolo) squadre( id_squadra, nome, citta) calendario( id_partita, id_sq_casa, id_sq_ospite, data) gol( id_partita, id_giocatore, minuto) Nome e Cognome degli attaccanti che non hanno segnato nessun gol in tutto il campionato. SELECT nome, cognome FROM giocatori EXCEPT FROM giocatori NATURAL JOIN gol WHERE ruolo = ‘attaccante’ Giugno-Pulvirenti AA 2005-2006
Giugno-Pulvirenti AA 2005-2006 Esercitazione 1 giocatori( id_giocatore, nome, cognome, eta, id_squadra, ruolo) squadre( id_squadra, nome, citta) calendario( id_partita, id_sq_casa, id_sq_ospite, data) gol( id_partita, id_giocatore, minuto) Nome, Cognome e Squadra di appartenenza del giocatore più giovane del campionato. Nota: Potrebbero essercene più di uno. SELECT giocatori.nome, giocatori.cognome,squadre.nome FROM giocatori NATURAL JOIN squadre WHERE eta = (SELECT MIN(eta) FROM giocatori) Giugno-Pulvirenti AA 2005-2006
Giugno-Pulvirenti AA 2005-2006 Esercitazione 1 giocatori( id_giocatore, nome, cognome, eta, id_squadra, ruolo) squadre( id_squadra, nome, citta) calendario( id_partita, id_sq_casa, id_sq_ospite, data) gol( id_partita, id_giocatore, minuto) Per ogni squadra indicare il nome ed il numero totale di gol segnati dall’inizio del campionato. SELECT squadre.nome, count(*) as ‘Gol fatti’ FROM squadre, giocatori, gol WHERE squadre.id_squadra = giocatori.id_squadra AND giocatori.id_giocatore = gol.id_giocatore GROUP BY squadre.nome Giugno-Pulvirenti AA 2005-2006
Giugno-Pulvirenti AA 2005-2006 Esercitazione 1 giocatori( id_giocatore, nome, cognome, eta, id_squadra, ruolo) squadre( id_squadra, nome, citta) calendario( id_partita, id_sq_casa, id_sq_ospite, data) gol( id_partita, id_giocatore, minuto) Indicare le partite (squadre e data) che sono terminate al punteggio di 1 a 1. SELECT s1.nome, s2.nome FROM calendario c, squadre s1, squadre s2 WHERE c.id_sq_casa = s1.id_squadra AND c.id_sq_ospite = s2.id_squadra AND 1 = (SELECT count(*) FROM giocatore NATURAL JOIN gol WHERE giocatore.id_squadra = s1.id_squadra AND gol.id_partita = c.id_partita) WHERE giocatore.id_squadra = s2.id_squadra Giugno-Pulvirenti AA 2005-2006
Giugno-Pulvirenti AA 2005-2006 Esercitazione 1 giocatori( id_giocatore, nome, cognome, eta, id_squadra, ruolo) squadre( id_squadra, nome, citta) calendario( id_partita, id_sq_casa, id_sq_ospite, data) gol( id_partita, id_giocatore, minuto) Usando una tecnica diversa da quella utilizzata nel punto h), indicare le partite (squadre e data) che sono terminate al punteggio di 0 a 0. SELECT s1.nome, s2.nome FROM calendario c, squadre s1, squadre s2 WHERE c.id_sq_casa = s1.id_squadra AND c.id_sq_ospite = s2.id_squadra AND NOT EXISTS (SELECT * FROM gol WHERE gol.id_partita = c.id_partita) Giugno-Pulvirenti AA 2005-2006
Giugno-Pulvirenti AA 2005-2006 Esercitazione 2 Considera una relazione con un solo attributo R(A). Scrivere una query SQL quanto più semplice possibile che restituisca tutti i valori di A che compaiono in R almeno 3 volte e mostrarli una volta sola in output. Puoi assumere che non ci siano NULL nella relazione. SELECT DISTINCT R.A FROM R, R r1, R r2 WHERE R.A = r1.A and r1.A = r2.A Giugno-Pulvirenti AA 2005-2006