Esercizio no.3:soluzione
Un proprietario (P) può possedere più immobili, un immobile ha un solo proprietario.
si tratta di una relazione 1:n (uno-molti)
Nel testo si parla di annessi (A) e si intuisce che che ogni immobile (I) può essere dotato di molteplici annessi, mentre ogni annesso fa capo ad un singolo immobile.
Il diagramma concettuale che ci serve (dotato di campi) può essere il seguente.
Arriviamo dunque alle query di creazione:
CREATE TABLE P ( IdP COUNTER PRIMARY KEY, Cognome CHAR(20), Nome CHAR(20)); |
CREATE TABLE I ( IdI COUNTER PRIMARY KEY, XidP INTEGER REFERENCES P(IdP), Tipo CHAR(20), Vani Integer, Costo Long, Sup Integer, Anno integer); |
CREATE TABLE A ( XidI INTEGER REFERENCES I(IdI), Tipo CHAR(20), Sup Integer); |
Ecco i valori da inserire nella tabella P (dei proprietari) e I degli immobili
IdP | Cognome | Nome |
1 | Rossi | Mario |
2 | Verdi | Giovanni |
3 | Gialli | Andrea |
4 | Neri | Marco |
5 | Bianchi | Walter |
6 | Magenta | Maria |
IdI | XidP | Tipo | Vani | Costo | Sup | Anno |
1 | 1 | Villa | 8 | 600.000 | 190 | 1980 |
2 | 1 | Appartamento | 4 | 320.000 | 90 | 1990 |
3 | 2 | Appartamento | 5 | 400.000 | 120 | 1995 |
4 | 3 | Capannone | 5 | 800.000 | 500 | 1993 |
5 | 4 | Villa | 4 | 450.000 | 110 | 1991 |
6 | 4 | Villa | 5 | 350.000 | 100 | 1984 |
7 | 5 | Capannone | 6 | 950.000 | 750 | 1998 |
8 | 5 | Appartamento | 3 | 250.000 | 75 | 1989 |
9 | 6 | Villa | 7 | 620.000 | 180 | 1997 |
10 | 6 | Appartamento | 4 | 380.000 | 100 | 1999 |
ed ecco l'ultima tabella da compilare: la tabella A degli annessi.
XidI | Tipo | Sup |
1 | Garage | 15 |
1 | Giardino | 200 |
1 | Rimessa | 90 |
2 | Cantina | 30 |
2 | Box | 12 |
3 | Posto Auto | 15 |
3 | Soffitta | 30 |
4 | Rimessa | 100 |
7 | Posto Auto | 150 |
7 | Rimessa | 50 |
8 | Box | 25 |
8 | Cantina | 40 |
9 | Giardino | 250 |
10 | Box | 15 |
10 | Cantina | 50 |
10 | Giardino | 20 |
Dopo aver popolato in via preliminare le suddette tabelle eseguiamo le query
q1: vogliamo sapere quanti box sono presenti nel database |
|||
SELECT COUNT(*) AS TOTALE FROM A WHERE A.Tipo='BOX'; |
|
q2: vogliamo sapere quante ville hanno a disposizione un giardino. |
|||
SELECT COUNT(*) AS TOTALE FROM I, A WHERE A.XidI=I.IdI AND A.Tipo='Giardino'; |
|
q3: vogliamo sapere quanti mq di superficie dispone il sig.Bianchi solo sugli immobili. |
|||
SELECT SUM(Sup) AS TOT FROM I, P WHERE P.idP=I.XidP AND P.Cognome='Bianchi'; |
|
q4: elencare tutti i possessori di una villa. |
|||||||
SELECT DISTINCT P.Cognome, I.Tipo FROM A,I,P WHERE A.XidI=I.idI AND P.idP=I.XidP AND I.Tipo='Villa'; |
|
q5: Elencare tutti i possessori di un appartamento con Box. |
|||||||||||||
SELECT DISTINCT P.Cognome, I.Tipo,
A.Tipo FROM A, I, P WHERE A.XidI=I.idI AND P.idP=I.XidP AND A.Tipo='Box'; |
|
q6: Elencare tutti i possessori di immobili la cui data di costruzione successiva al 1996. |
|||||||||||||
SELECT P.Cognome, I.Tipo, I.Anno FROM I,P WHERE P.idP=I.XidP AND I.Anno>1996; |
|
q7: Produrre una vista dei proprietari di appartamenti con a fianco il numero di vani complessivi disponibili. |
|||||||||||
SELECT P.Cognome, SUM(I.Vani) AS TOT FROM I,P WHERE P.idP=I.XidP AND I.Tipo='Appartamento' GROUP BY P.Cognome; |
|
q8: Produrre una vista dei proprietari la cui somma dei mq degli immobili posseduti sia superiore a 400 mq. |
|||||||
SELECT P.Cognome, SUM(I.Sup) AS TOT
FROM I,P WHERE P.idP=I.XidP GROUP BY P.Cognome HAVING SUM(I.Sup)>=400; |
|