Basi di dati: appello 16/02/10 i consideri il seguente schema di base di dati che vuole tenere traccia delle informazioni relative ai partecipanti a gare podistiche in Lombardia CORSA (Codice, Nome, IndirizzoPartenza, CittàPartenza, IndirizzoArrivo, CittàArrivo, Numerokm, Tempolimite) PODISTA (CF, Nome, Cognome, Indirizzo, Città, DataNascita) PARTECIPAZIONE (CodiceGara, CodicePartecipante, Categoria, Tempo, OrdineArrivoTot) PREMIO (CodicePremio, Descrizione, Valore) ASSEGNAZIONEPREMIO (CodiceGara, Categoria,CodicePartecipante, OrdineArrivoCat, CodicePremio) Linguaggi Formali Esprimere in algebra (ottimizzata), calcolo relazionale la seguente query: Trovare i nomi e cognomi di tutte le donne che hanno partecipato a gare podistiche sia nella categoria femminile-u18 sia nella categoria femminile ma non hanno mai vinto un premio.
Π CF, nome, cognome CodicePartecipante=CF i t CF Π CF, Nome,Cognome - Podista Π CodicePartecipante σ Categoria= Femminile Partecipazioneione Π CodicePartecipante σ Categoria= FemminileU18 Partecipazioneione Π CodicePartecipante Assegnazione Premio
Linguaggi Formali Calcolo Relazionale l {t t1 Podista, t2,t3 Partecipazione (t[cf, Nome, Cognome]=t1[CF, Nome, Cognome] t1[cf]=t2[codicepartecipante] t2[categoria]= Femminile t3[categoria] = FemminileU18 t2[codicepartecipante] = t3[codicepartecipante] ) ( t4 AssegnazionePremio (t1[cf]=t4[codicepartecipante]))) t4[codicepartecipante]))) }
SQL: interrogazioni Trovare il nome e cognome dei corridori che hanno partecipato ad almeno dieci maratone (42, 195 km) e almeno una volta sono arrivati primi in assoluto. (3 punti) SELECT Nome, Cognome FROM Podista WHERE CF IN (SELECT CodicePartecipante FROM PARTECIPAZIONE JOIN CORSA ON CodiceGara=Codice WHERE NumeroKM=42,195 GROUP BY CodicePartecipante HAVING COUNT(*) >= 10) AND CF IN (SELECT CodicePartecipante FROM PARTECIPAZIONE WHERE OrdineArrivoTot= Primo )
SQL: interrogazioni Trovare, nell ambito delle maratone (42, 195 km), per ognicategoria il corridore con il tempo medio più alto. (3 punti) CREATE VIEW CONTROLLATEMPO (Partecipante, Categoria, TempoMedio) AS SELECT CodicePartecipante, Categoria, AVG(tempo) FROM PARTECIPAZIONE GROUP BY CodicePartecipante, Categoria SELECT Partecipante, categoria FROM CONTROLLATEMPO AS C1 WHERE TempoMedio =(SELECT MAX (tempo) FROM CONTROLLATEMPO WHERE categoria = C1.categoria)
create table PREMIO SQL DDL ( CodicePremio Varchar(6) Primary key, ) Descrizione Memo, Valore Real
SQL DDL create table AssegnazionePremio (CodiceGara Varchar(6), Categoria Enum ( Maschile-U18, Maschile, Femminile- U18, Femminile ), CodicePartecipante Char(16), OrdineArrivoCat Enum ( Primo, Secondo, Terzo ), CodicePremio Varchar(6) references Premio(CodicePremio) on update cascade on delete no action primary key(codicegara CodiceGara, Categoria, CodicePartecipante) i t foreign key(codicegara, Categoria, CodicePartecipante) references Partecipazione(CodiceGara, Categoria, CodicePartecipante) on update cascade on delete no action )
SQL: espressione di vincoli All interno di ogni gara, il primo podista premiato per ogni categoria sia quello che ha fatto il tempo migliore all interno della stessa categoria CREATE ASSERTION ControlloVittorie CHECK (NOT EXIST( SELECT CodicePartecipante FROM PARTECIPAZIONE AS A JOIN ASSEGNAZIONEPREMIO ON Partecipazione.CodicePartecipante= AssegnazionePremio.CodicePartecipante WHERE OrdineArrivoCat = Primo AND Tempo <> ( SELECT MIN (Tempo) FROM Partecipazione WHERE CodiceGara=A.CodiceGara AND Categoria=A.Categoria )))
Progettazione CF Nome Cognome Indirizzo i Gestore Comune (0,1) IVA Gestione AnnoInizio Sconto Nome Località Affitta Negozio Conenione Convenzione Albergo Nome Stazione sciistica Comprensorio Provincia Affitta Codice Affitta Prezzo Prodotto Codice Num_giorni (0,N) Contratto Affitto Stipula Indirizzo Telefono Alloggio CF Nome Cognome Cliente Categoria Pista Codice (t,e) Scarponi Descrizione Sci/Racchette Snowboard Numero Tipo Lunghezza Tipo
Progetto logico Negozio (PartitaIva, Gestore, AnnoInizio, StazioneSciistica) Gestore(CF, Nome, Cognome, Indirizzo, Comune) Prodotto (Codice, Descrizione, Prezzo, Categoria, NumeroScarpone*, TipoScarpone*, Lunghezza*, Tipo*,Negozio) Affitto (Codice, Cliente) ProdottiAffittatti (Prodotto, CodiceAffitto, NumeroGiorni) Cliente(CF, Nome, Cognome, NomeAlbergo, LocalitàAlbergo) Albergo(Nome, Località, Indirizzo, Telefono) Convenzione (Negozio, NomeAlbergo, LocalitàAlbergo, Sconto) StazioneSciistica(Nome, Comprensorio, Provincia) Pista (StazioneSciistica, Codice, Categoria)
Vincoli Negozio.Gestore Gestore.CF Negozio.StazioneSciistica StazioneSciistica.Nome Prodotto.Negozio Negozio.PartitaIva ProdottiAffittati.Prodotto Prodotto.Codice ProdottiAffittati.CodiceAffitto Affitto.Codice Affitto.Cliente Cliente.CF Cliente.[NomeAlbergo, LocalitàAlbergo] Albergo.[Nome, Località] Convenzione.Negozio Negozio.PartitaIva Convenzione.[NomeAlbergo, LocalitàAlbergo] Albergo.[Nome, Località] Pista.StazioneSciistica StazioneSciistica.Nome