Basi di dati: appello 28/02/06 Si consideri il seguente schema di base di dati che vuole tenere traccia della programmazione delle radio italiane: EMITTENTE (id, nome, frequenza, città.) SCALETTA (id_radio, nome_trasmissione, giorno, brano, ora_inizio) TRASMISSIONE (id_radio, nome_trasmissione, speaker, durata) BRANO (id_brano, titolo, artista, genere, durata) SPEAKER (CF, Nome, Cognome, datadinascita, cittànascita, telefono) Linguaggi Formali Esprimere in algebra e calcolo relazionale la seguente query: Trovare i nomi degli speaker che conducono almeno due trasmissioni differenti all interno della stessa radio ma che non hanno mai condotto trasmissioni con durata inferiore ai 60 minuti. Π nome,cognome (speaker CF=speaker (Π speaker (σ trasmissione<>t (trasmissione id_radio=r speaker =s (ρ (r, s,t) (id_radio,speaker,nome_trasmissione) trasmissione))) - Π speaker (σ durata>60 trasmissione))) 1
Linguaggi Formali {t t1 speaker, t2 trasmissione, t3 trasmissione (t[nome]=t1[nome] t[cognome]=t1[cognome] t1[cf]= t2[speaker] t2[id_radio]=t3[id_radio] t2[speaker]= t3[speaker] t2[nome_trasmissione]<>t3[nome_trasmissio ne] ( t4 trasmissione (t4[id_radio] = t2[id_radio] t4[speaker] = t2[speaker] t4[nome_trasmissione] = t2[nome_trasmissione] t4[durata] >60)))} SQL: interrogazioni Trovare i nomi delle trasmissioni e i giorni in cui la relativa scaletta prevedeva almeno due brani di musica rock e nessun brano di musica classica SELECT nome_trasmissione, giorno FROM SCALETTA JOIN BRANO ON brano=id_brano WHERE genere = rock and id_radio, nome_trasmissione, giorno NOT IN (SELECT id_radio, nome_trasmissione, giorno FROM SCALETTA JOIN BRANO ON brano=id_brano WHERE genere= classica ) GROUP BY id_radio, nome_trasmissione, giorno HAVING COUNT(*)>=2 2
SQL: interrogazioni Trovare quale (o quali) speaker conducono trasmissioni in cui la durata totale dello spazio dedicato ai brani musicali è sopra la media rispetto alle altre trasmissioni CREATE VIEW SpazioBrani(radio,trasmissione,spazio) AS SELECT id_radio, nome_trasmissione, SUM(durata) FROM SCALETTA, BRANO WHERE scaletta.brano=brano.id_brano GROUP BY id_radio, nome_trasmissione SELECT Nome, Cognome FROM SPEAKER, TRASMISSIONE, SpazioBrani WHERE Speaker.CF = Trasmissione.speaker AND Trasmissione.id_radio=SpazioBrani.radio AND Trasmissione.nome_trasmissione=SpazioBrani.nome_trasmissione and spazio >= (SELECT AVG(spazio) FROM SpazioBrani) SQL DDL create table SCALETTA ( id_radio char(6), nome_trasmissione varchar (15), giorno date not null, brano char(6) references BRANO(id_brano id_brano) on delete cascade on update cascade, ora_inizio time, primary key (id_radio, nome_trasmissione, giorno, brano) foreign key (id_radio, nome_trasmissione) references TRASMISSIONE (id_radio( id_radio, nome_trasmissione) on delete cascade on update cascade); 3
SQL DDL create table TRASMISSIONE ( id_radio char(6) references EMITTENTE (id_radio) on update cascade on delete cascade, nome_trasmissione varchar (15), speaker char(16) references SPEAKER (CF) on update cascade on delete cascade, durata INT, primary key(id_radio id_radio, nome_trasmissione) ); SQL: espressione di vincoli La somma della durata dei brani previsti per una trasmissione non superi la durata della trasmissione stessa. CREATE ASSERTION ControlloDurata CHECK (NOT EXIST (SELECT * FROM TRASMISSIONE WHERE durata < ANY (SELECT SUM (Durata) FROM scaletta, brano WHERE scaletta.brano=brano.id_brano AND id_radio=trasmissione.id_radio AND nome_trasmissione=trasmissione.nome_trasmissione GROUP BY id_radio, nome_trasmissione, giorno))) 4
Relativo a Pagamento Numero carta Codice (0,1) Num. posti Relativa a Data Prenotazione Numero effettua Sconto Prenotazione Con tessera Indirizzo Telefono Mail Cliente CF Nome Cognome Nome Capienza (0,1) Data Ora Rappresenta zione Svolta in Sala acquista (1,N) Carta Cod_carta Data emissione Progettazione Durata (1,N) Spettacolo (t,e) Titolo Genere regista Spettacolo teatrale Nome compagnia Film Attore protagonista Progetto logico Cliente (CF, Nome, Cognome, Indirizzo, Telefono, mail) Carta(Cod_carta, Data_emissione, CF_cliente) Prenotazione (Numero, Data, CF_cliente, tipo_pren, sconto*) Pagamento (Codice, Num_carta, Num_prenotazione) Spettacolo (Titolo, genere, regista, durata, tipo, nomecompagnia*, attoreprotagonista*) Rappresentazione (Titolo, Data,ora, sala) Sala (Nome, Capienza) DettagliPrenotazione (Num_prenotazione, Titolo, Data, Ora, Num_Posti) 5
Vincoli di integrità Carta.CF_cliente Cliente.CF Prenotazione.CF_cliente Cliente.CF Pagamento.Num_prenotazione Prenotazione.Numero Rappresentazione.Titolo Spettacolo.Titolo Rappresentazione.Sala Sala.Nome Ordine.CF_cliente Cliente.CF DettagliPrenotazione.[Titolo, Data, Ora] Rappresentazione.[Titolo, Data, Ora] DettagliPrenotazione.Num_prenotazione Prenotazione.Numero 6