Basi di dati: appello 21/09/12 Si consideri il seguente schema di base di dati che vuole tenere traccia degli immobili venduti da diverse agenzie dislocate su tutto il territorio nazionale: AGENZIA (Codice, Nome, Indirizzo, Città, Telefono, CFTitolare) IMMOBILE (CodiceAgenzia, CodiceImmobile, Indirizzo, Città, Tiipologia, Superficie, Vani, valorestimato, valoreproposto, CFProprietario) VENDITA (CodiceContratto, CodiceAgenzia, CodiceImmobile, CFAcquirente, Data, PrezzoVendita, CFAgente) PERSONA (CF, Nome, Cognome, Indirizzo, Città, Tel) Il campo Tipologia della tabella IMMOBILE rappresenta la tipologia dell immobile gestito: popolare, economico, civile, signorile, lusso. Il campo CFProprietario nella tabella IMMOBILE si riferisce alla persona che vuole vendere l immobile. La tabella PERSONA contiene i dati anagrafici sia delle persone che lavorano all interno dell agenzia che dei proprietari e acquirenti degli immobili. NOTA: ogni immobile è gestito da una sola agenzia. Linguaggi Formali Esprimere in algebra (ottimizzata), calcolo relazionale e Datalog la seguente query: Trovare codice fiscale, cognome e nome delle persone che nel 2011 sono state sia venditori che acquirenti (di due immobili diversi).
Π CF, Nome, Cognome Π CF, Nome, Cognome CF=CFProprietario Π CFProprietario PERSONA σ CodiceAgenzia<>A OR CodiceImmobile<>I CFProprietario=CFAcquirente, ρ Aß CodiceAgenzia, Iß CodiceImmobile Π CodiceAgenzia, CodiceImmobile,CFProprietario IMMOBILE Π CodiceAgenzia, CodiceImmobile σ Data>01/01/2011 AND Data<31/12/2011 VENDITA Π CodiceAgenzia, CodiceImmobile,CFAcquirente σ Data>01/01/2011 AND Data<31/12/2011 VENDITA
Linguaggi Formali Calcolo Relazionale {t t1 PERSONA, t2 IMMOBILE, t3,t4 VENDITA (t[cf, Nome, Cognome]=t1[CF, Nome, Cognome] t1[cf]=t2[cfproprietario] t2[codiceagenzia, CodiceImmobile] = t3[codiceagenzia, CodiceImmobile] t3[data]>31/12/2010 t3[data]<01/01/2012 t4[data]>31/12/2010 t4[data]<01/01/2012 t2[cfproprietario] = t4[cfacquirente] t2[codiceagenzia, CodiceImmobile] <> t4[cfacquirente, CodiceImmobile])
Linguaggi Formali - DataLog VenditoriAcquirenti(CF, Nome, Cognome):- PERSONA (CF, Nome, Cognome, _, _,_ ) IMMOBILE (Agenzia, Immobile, _, _, _, _, _,_, _, CFProp) VENDITA (_, Agenzia, Immobile, CF, _, _, _) VENDITA (_, Agenzia1, Immobile1, CF, _, _) Agenzia<>Agenzia1 VenditoriAcquirenti(CF, Nome, Cognome):- PERSONA (CF, Nome, Cognome, _, _,_ ) IMMOBILE (Agenzia, Immobile, _, _, _, _, _,_, _, CFProp) VENDITA (_, Agenzia, Immobile, CF, _, _, _) VENDITA (_, Agenzia1, Immobile1, CF, _, _) Immobile<>Immobile1? - VenditoriAcquirenti (X, Y, Z)
SQL: interrogazioni Trovare il riferimento agli agenti che hanno gestito più di 15 vendite ma una sola relativa a immobili di categoria lusso SELECT CFAgente FROM VENDITA WHERE CFAgente IN (SELECT CFAgente FROM VENDITA JOIN IMMOBILE ON Vendita.[CodiceAgenzia, CodiceImmobile]=Immobile. [CodiceAgenzia, CodiceImmobile] WHERE Tipologia = lusso GROUPBY CFAgente HAVING Count(*) =1) GROUPBY CFAgente HAVING Count(*)>=15
SQL: interrogazioni Trovare il nome e cognome dei titolari delle agenzie che nel corso del 2011 hanno venduto più case rispetto al 2010 CREATE VIEW Vendite2011 (Agenzia, Vendite) AS SELECT CodiceAgenzia, COUNT(*) FROM VENDITA WHERE DATA BETWEEN 01/01/2011 AND 31/12/2011 GROUP BY CodiceAgenzia SELECT Nome, Cognome FROM Vendite2011, Agenzia As A WHERE Vendite2011.Agenzia=A.Codice AND Vendite > (SELECT COUNT(*) FROM VENDITA AS V WHERE V.CodiceAgenzia=A.Codice AND DATA BETWEEN 01/01/2010 AND 31/12/2010)
SQL DDL create table AGENZIA ( Codice char(6), Nome varchar (20), Indirizzo varchar(25), Città varchar (20), Telefono varchar(15), CFTitolare char(16)references PERSONA (CF) on update cascade, on delete no action, primary key (Codice) )
SQL DDL create table VENDITA ( CodiceContratto char(6) primary key, CodiceAgenzia char(6), CodiceImmobile char(4), CFAcquirente char(16) char(16)references PERSONA (CF) on update cascade on delete no action, Data Date, PrezzoVendita Numeric (9,2) CFAgente char (16) char(16)references PERSONA (CF) on update cascade on delete no action, foreign key (CodiceAgenzia, CodiceImmobile) references IMMOBILE(CodiceAgenzia, CodiceImmobile) on delete cascade on update no action)
SQL: espressione di vincoli Il prezzo di vendita deve sempre essere superiore al valore stimato CREATE ASSERTION ControlloPrezzo CHECK ( NOT EXISTS (SELECT * FROM Immonile JOIN Vendita ON Immobile.[CodiceAgenzia,CodiceImmobile]=Vendita. [CodiceAgenzia,CodiceImmobile] WHERE PrezzoStimato > PrezzoVendita))
Piscina Nome Tel Vasca Struttura Codice P_max Corsi Organizza Codice Lezione Presenti Iscritto Responsabile Indirizzo Composizione Progettazione Nome Descrizione Turno Tipologia composto Numero Fax P_min Giorno Nome Svolto Ora_Inizio Durata Insegnante Numero Data CF Nome Cognome DataNascita (0,N) (0,N) Fitness Nuoto Disciplina Matr Cognome Nome DataNascita D_Assunzione Tel (T,S) Abilitati Iscrizione Codice Riferimento (0,N) Effettuata Data Prezzo Nuoto libero Svolge OraFine OraInizio Svolge Nome
Progetto logico Piscina (Nome, Indirizzo, Tel, Fax) Vasca (NomePiscina, Codice, P_max, P_min) Corsi (Codice, Nome, Descrizione, Piscina) Turno (CodiceCorso, Numero, Tipologia, Ora_inizio, Durata, Insegnante) GiorniTurni (CodiceCorso, Numero, Giorno) Giorni(Nome) Lezione (CodiceCorso, NumeroTurno, NumeroLezione, Data) Iscritto (CF, Nome, Cognome, DataNascita) Presenti (CodiceCorso, NumeroTurno, NumeroLezione, Iscritto) Iscrizione (Codice, Data, Prezzo, Iscritto, CodiceCorso, Numero) Insegnante (Matricola, Nome, Cognome, Tel, Data_Nascita, Data_Assunzione, Tipo) Disciplina (Nome) Competenze (Insegnante, Disciplina) NuotoLibero (NomePiscina, CodiceVasca, Giorno, OraInizio, OraFine)
Vincoli di integrità Vasca.NomePiscina à Piscina.Nome Corsi.Piscinaà Piscina.Nome Turno.CodiceCorso à Corsi.Codice GiorniTurni.[CodiceCorso, Numero]à Turno. [CodiceCorso, Numero] GiorniTurni.Giorno à Giorno.Nome Lezione.[CodiceCorso, Numero]à Turno. [CodiceCorso, Numero] Presenti [CodiceCorso, NumeroTurno, NumeroLezione] à Lezione. [CodiceCorso, NumeroNumeroLezione] Presenti.Iscritto à Iscritto.CF Iscrizione.[CodiceCorso, Numero]à Turno. [CodiceCorso, Numero] Iscrizione.Iscrittoà Iscritto.CF Competenze.Insegnante à Insegnante.Matricola Competenze.Disciplina à Disciplina.Nome Turno.Insegnanteà Insegnante.Matricola NuotoLibero.[NomePiscina, CodiceVasca] à Vasca.[NomePiscina, Codice] NuotoLibero.Giornoà Giorno.Nome