Basi di dati: appello 08/03/06 Si consideri il seguente schema di base di dati che vuole tenere traccia delle rappresentazioni di un gruppo di compagnie teatrali: COMPAGNIA (nome, cfdirettore, città_sede) TEATRO (id_teatro, nome, città, numero di telefono) CALENDARIO (id_teatro, giorno, titolo, compagnia, ora_inizio, prezzo_biglietto) SPETTACOLO (titolo, compagnia, genere, durata) PERSONA (CF, Nome, Cognome, datadinascita, cittànascita, telefono) Linguaggi Formali Esprimere in algebra e calcolo relazionale e Datalog la seguente query: Trovare i nomi dei direttori di compagnie che effettuano almeno due rappresentazioni diverse in uno stesso teatro ma che non hanno mai effettuato rappresentazioni di genere comico. Π nome,cognome (persona CF=cfdirettore (Π cfdirettore (compagnia nome=compagnia (Π compagnia (σ titolo<>t (calendario id_teatro=te compagnia =c (ρ (te,c,,t) (id_teatro, compagnia, titolo) calendario))) Π compagnia (σ genere= comico spettacolo))))) 1
Linguaggi Formali {t t1 persona, t2 calendario, t3 calendario, t4 compagnia (t[nome]=t1[nome] t[cognome]=t1[cognome] t1[cf]= t4[cfdirettore] t2[id_teatro]=t3[id_teatro] t2[compagnia]= t3[compagnia] t2[titolo]<>t3[titolo] t4[nome]<>t2[compagnia] ( t5 spettacolo (t5[compagnia] = t4[nome] t5[genere] = comico )))} Linguaggi Formali CompagniaNoComico(Nome) :- spettacolo(_,nome, comico,_) Direttori(Nome,Cognome):- Persona(CF,Nome,Cognome,_,_,_), Compagnia(Nome, CF,_), Calendario(Teatro,_,titolo1, Nome,_,_), Calendario(Teatro,_,titolo2, Nome,_,_), CompagniaNoComico(Nome), titolo1<>titolo2 2
SQL: interrogazioni Trovare i nomi e gli indirizzi dei teatri il cui calendario preveda almeno due rappresentazioni di genere comico e nessuno spettacolo della compagnia Il Teatrino SELECT nome, città FROM TEATRO WHERE id_teatro IN (SELECT id_teatro FROM CALENDARIO JOIN SPETTACOLO ON calendario.titolo=spettacolo.titolo AND calendario.compagnia=spettacolo.compagnia WHERE genere= comico GROUP BY id_teatro HAVING COUNT(DISTINCT (titolo))>=2) AND id_teatro NOT IN (SELECT id_teatro FROM CALENDARIO WHERE compagnia= Il teatrino ) SQL: interrogazioni Trovare quale compagnia ha in programma il maggior numero di rappresentazioni nel teatro Teatro Romano di Verona CREATE VIEW NumRappr(Compagnia,Numero) AS SELECT compagnia, count(*) as Numero FROM CALENDARIO, TEATRO WHERE calendario.id_teatro=teatro.id_teatro AND Teatro.Nome= Teatro Romano AND Teatro.Città= Verona GROUP BY compagnia SELECT Compagnia FROM NumRappr WHERE Numero = (SELECT MAX(Numero) FROM NumRappr) 3
SQL DDL create table TEATRO ( id_teatro char(6) primary key nome_varchar (20), città varchar(15), numero_telefono varchar(15), ); SQL DDL create table CALENDARIO ( id_teatro char(6) references TEATRO (id_teatro) on delete cascade on update cascade, giorno date, titolo varchar(20), compagnia varchar(20), ora_inizio time, prezzo_biglietto integer, primary key (id_teatro,, giorno, titolo, compagnia) foreign key (titolo, compagnia) references SPETTACOLO (titolo, compagnia) on delete cascade on update cascade); 4
SQL: espressione di vincoli La somma della durata delle rappresentazioni previste per un teatro in un giorno non superi le 6 ore. CREATE ASSERTION ControlloDurata CHECK ( 6 > ALL (SELECT SUM (Durata) FROM Calendario, Spettacolo WHERE Calendario.titolo=spettacolo.titolo AND Calendario.compagnia=spettacolo.compagnia GROUP BY id_teatro, giorno)) SQL: espressione di vincoli (2) La somma della durata delle rappresentazioni previste per un teatro in un giorno non superi le 6 ore. CREATE ASSERTION ControlloDurata CHECK ( NOT EXIST (SELECT * FROM Calendario, Spettacolo WHERE Calendario.titolo=spettacolo.titolo AND Calendario.compagnia=spettacolo.compagnia GROUP BY id_teatro, giorno HAVING (sum(durata)) > 6)) 5
Relativo a Pagamento Numero carta Codice (0,1) Relativa a Data Iscrizione Numero effettua (1,n) Indirizzo Telefono Mail Cliente CF Nome Cognome Sconto Nome Capienza acquista Iscrizione socio Cod_carta Data emissione Giorno Ora Turno Svolta in (0,n) Sala (t,e) Associato a Piscina Tipo Stanza Numero Corso (t,e) Disciplina Data Inizio frequenza Nuoto Livello partecipanti Palestra Nome istruttore Progetto logico Cliente (CF, Nome, Cognome, Indirizzo, Telefono, mail) TesseraSocio(Cod_carta, Data_emissione, CF_cliente) Iscrizione (Numero, Data, CF_cliente, tipo_pren, sconto*) Pagamento (Codice, Num_carta, Num_iscrizione) Corso (Disciplina, Data_inizio, frequenza, tipo, Livellopartecipanti*, nomeistruttore*) Turno (Disciplina, Giorno, ora, Piscina*, Stanza*) Piscina (NomePiscina, Capienza, tipo_piscina) Stanza (NomeStanza, Capienza, numero_stanza) RelativaA (Num_iscrizione, Disciplina) 6
Vincoli di integrità TesseraSocio.CF_cliente Cliente.CF Iscrizione.CF_cliente Cliente.CF Pagamento.Num_iscrizione Iscrizione.Numero Turno.Disciplina Corso.Disciplina Turno.Piscina Piscina.NomePiscina Turno.Stanza Stanza.NomeStanza RelativaA.Disciplina Corso.Disciplina RelativaA.Num_iscrizione Iscrizione.Numero 7