Basi di dati: appello 14/07/06 Si consideri il seguente schema di base di dati che vuole tenere traccia dell attività di un agenzia che affitta appartamenti per vacanze nella città di Varazze. CLIENTE (CodiceFiscale, Cognome, Nome, Residenza) APPARTAMENTO (CodAppartamento, PalazzoIndirizzo, PalazzoScala, Locali, Metratura) PALAZZO (Indirizzo, Scala, NumeroPiani, Nomeamministratore, CognomeAmministratore) AFFITTO (CodiceCliente, CodAppartamento, DataInizio, DataFine, Prezzo) Linguaggi Formali Esprimere in algebra (ottimizzata), calcolo relazionale la seguente query: Trovare i nomi e i cognomi dei clienti che hanno effettuato almeno due affitti di appartamenti con più di 2 locali o che hanno affittato nell anno 2005 almeno un appartamento amministrato dal signor Giuseppe Bianchi. Π nome, Cognome CodiceFiscale=CodiceCliente Π CodiceCliente Cliente Π CodiceCliente σ (Cod_Appartamento<>C) (DataInizio<>D) CodiceCliente=Cod Π CodiceCliente, Cod_Appartamento σ DataInizio>=01/01/2005 DataInizio<=31/12/2005 Π Cod_Appartamento Π Cod_Appartamenro σ Locali >2 Appartamento Π codicecliente, Cod_Appartamento, DataInizio Π Cod_Appartamenro σ Locali >2 Cod_Appartamento=C Π indirizzo, Num_Edificio Π Cod_Appartamento, Indirizzo, Num_Edificio Appartamento σ cognomeamministratore = Bianchi nomeamministratore = Giuseppe Π Cod,C,D ρ Cod CodiceCliente, C Cod_Appartamento, D DataInizio Palazzo Appartamento 1
Linguaggi Formali Calcolo Relazionale {t t1 cliente, t2, t3, t4,t5 Appartamento (t[nome]=t1[nome] t[nome]=t1[cognome] t1[codicefiscale]=t2[codicecliente] t2[cod_appartamento]=t4[cod_appartamento] t3[cod_appartamento]=t5[cod_appartamento] t4[locali]>2 t5[locali]>2 (t2[cod_appartamento]<>t3[cod_appartamento] t2[datainizio]<>t3[datainizio]) ( t6, t7 Appartamento, t8 Palazzo (t1[codicefiscale]=t6[codicecliente] t7[indirizzo]=t8[indirizzo] t7[num_edificio]=t8[num_edificio] t6[cod_appartamento]=t7[cod_appartamento] t6[datainizio] >=01/01/2005 t6[datainizio] <=31/12/2005 t8[cognomeamministratore]= Bianchi t8[nomeamministratore] = Giuseppe ))) } SQL: interrogazioni Trovare i nomi e i cognomi degli amministratori che hanno in gestione almeno 5 appartamenti di più di 100mq, ognuno dei quali è stato affittato almeno una volta SELECT CognomeAmministratore, NomeAmministratore FROM Palazzo, Appartamento WHERE Palazzo.Indirizzo= Appartamento.Indirizzo AND Palazzo.Num_Edificio= Appartamento.Num_Edificio AND Metratura > 100 AND Cod_Appartamento IN (SELECT Cod_Appartamento FROM ) GROUP BY CognomeAmministratore, NomeAmministratore HAVING COUNT(*)>=5 2
SQL: interrogazioni Trovare i nomi e cognomi dei clienti che hanno effettuato il minor numero di affitti di appartamenti di 3 locali nell anno 2004. CREATE VIEW Num_Affitti (CFCliente, N_Affitti) AS SELECT CodiceCliente, COUNT(*) FROM, Appartamento WHERE.Cod_Appartamento=Appartamento.Cod_Appartamento AND DataInizio>=01/01/2004 AND DataInizio<=31/12/2004 AND Locali=3 GROUP BY CodiceCliente SELECT Nome, Cognome FROM Cliente JOIN Num_Affitti ON Cliente.CodiceFiscale=Num_Affitti.CFCliente WHERE N_Affitti = (SELECT MIN(N_Affitti) FROM Num_Affitti) SQL DDL create table PALAZZO ( Indirizzo varchar(50), Num_Edificio Integer, Num_Piani Integer, CognomeAmministratore varchar(15), NomeAmministratore varchar (20), primary key (Indirizzo, Num_Edificio) ) 3
SQL DDL create table APPARTAMENTO ( Cod_Appartamento char(6), Indirizzo varchar(50), Num_Edificio Integer, Locali Integer, Metratura Integer, Piano Integer, primary key(cod_appartamento Cod_Appartamento), foreign key (Indirizzo, Num_Edificio) references PALAZZO(Indirizzo, Num_Edificio) on delete cascade on update cascade) SQL: espressione di vincoli Per gli affitti di durata maggiore di 5 giorni il prezzo deve essere superiore a 500 euro CREATE ASSERTION ControlloPrezzo CHECK ( NOT EXISTS (SELECT * FROM WHERE Prezzo < 500 AND (DataFine-DataInizio) >5)) oppure CREATE ASSERTION ControlloPrezzo CHECK ( 500< ALL (SELECT Prezzo FROM Noleggio WHERE (DataFine-DataInizio) >5)) 4
Progettazione Nome D_inizio D_fine NumeroData_Inizio Titolo Progetto Organizzazione Fasi Data_Fine Output Rapporto Tecnico Num_Pagine Stato DataInizio DataFine Partecipazione Persone Finanziamento Partecipazione Unità Responsabile Unità Contributo Nome Città Risorse coinvolte Azienda Nome Cognome Data nascita Persona Numero Capitale Codice dipendenti sociale Fiscale Nazionalità Ruolo Progetto logico Progetto(Nome, D_inizio, D_fine) Fasi(NomeProgetto, D_inizio Progetto, Numero, Data_Inizio, Data_Fine) RapportoTecnico (NomeProgetto, D_Inizio_Progetto, NumeroFase, UnitàResponsabile, Titolo, Num_pagine) Unità (Nome,Città,Numero Dipendenti*, Capitale Sociale*) Contributo (NomeProgetto, D_Inizio_Progetto, NumeroFase, UnitàResponsabile, Nome_unità, Stato) Partecipazione_Unità (NomeProgetto, NomeUnità, Finanziamento) Persona (CodiceFiscale, Nome, Cognome, DataNascita, Nazionalità, Ruolo) Partecipazione_Persona(NomeProgetto, CodicePersona, Data_inizio, Data_fine) 5