Lezione 8
Problema
Vogliamo creare un database che tenga traccia di tutte le stanze e dei dati relativi alle loro prenotazioni presenti e passate.
Per ciascuna stanza ci interessano le seguenti informazioni:
il numero, la metratura, il piano, la tipologia (se singola o
matrimoniale) e la quantità massima di letti aggiuntivi possibile.
Inoltre, per ciascuna stanza si vuole poter risalire a tutti i
clienti che nel tempo l'hanno occupata.
Ovviamente, si gestisce l'anagrafica di tutti i clienti.
Schema Concettuale: ER
Nota.
Qui il campo lettiAggiuntivi viene forzatamente definito opzionale: quando vengono aggiunti letti avrà un valore significativo, quando no avrà valore NULL. In realtà in questo caso il valore potrebbe tranquillamente essere 0 ma per poter introdurre più tardi in questa lezione dei costrutti per le query lo abbiamo definito opzionale.
Schema logico: relazionale
province (id, nome)
localita (id, nome, cap, idProvincia)
ospiti (id, nome, cognome, via, civico, numTelefono, idLocalita)
stanze (id, numero, metratura, piano, tipologia, maxLettiAggiuntivi)
ospitiSuStanze (id, dal, al, lettiAggiunti*, idOspite, idStanza)
Esempio di istanza
| province | |||||||||
| id | nome | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| 1 | Trento | ||||||||
| 2 | Caserta | ||||||||
| localita | |||||
| id | nome | cap | idProvincia | ||
|---|---|---|---|---|---|
| 3 | Pergine Valsugana | 38057 | 1 | ||
| 4 | Borgo Valsugana | 38051 | 1 | ||
| 5 | Arco | 38062 | 1 | ||
| 6 | Mezzolombardo | 38017 | 1 | ||
| 7 | Madonna di Campiglio | 38084 | 1 | ||
| 8 | Caserta | 81100 | 2 | ||
| 9 | Maddaloni | 81024 | 2 | ||
| 10 | Casagiove | 81022 | 2 | ||
| 11 | San Nicola La Strada | 81020 | 2 | ||
| ospiti | |||||||||
| id | nome | cognome | via | civico | numTelefono | idLocalita | |||
|---|---|---|---|---|---|---|---|---|---|
| 12 | Giorgio | Feola | Modena | 82 | 3476644551 | 4 | |||
| 13 | Beatrice | Feola | Roma | 182 | 3201597532 | 6 | |||
| 14 | Michela | Zancanella | Genova | 4 | 3255666541 | 5 | |||
| 15 | Stefano | De Santis | Machiavelli | 40 | 3957698541 | 8 | |||
| 16 | Raffaele | Cennamo | Milano | 1 | 0823547858 | 8 | |||
| stanze | |||||
| id | numero | metratura | piano | tipologia | maxLettiAggiuntivi |
|---|---|---|---|---|---|
| 17 | 100 | 20 | 1 | singola | 2 |
| 18 | 101 | 30 | 1 | matrimoniale | 1 |
| 19 | 102 | 30 | 1 | matrimoniale | 2 |
| 20 | 200 | 20 | 2 | singola | 2 |
| 21 | 201 | 30 | 2 | matrimoniale | 0 |
| 22 | 202 | 30 | 2 | matrimoniale | 0 |
| 23 | 300 | 60 | 3 | matrimoniale | 0 |
| ospitiSuStanze | |||||
| id | dal | al | lettiAggiuntivi | idOspite | idStanza |
|---|---|---|---|---|---|
| 24 | '2010-8-10' | '2010-8-20' | 1 | 14 | 20 |
| 25 | '2010-8-15' | '2010-8-30' | 16 | 23 | |
| 26 | '2011-7-29' | '2011-8-10' | 16 | 22 | |
| 27 | '2011-8-12' | '2011-8-18' | 1 | 14 | 17 |
| 28 | '2011-8-20' | '2011-9-5' | 2 | 15 | 17 |
| 29 | '2012-7-28' | '2012-8-13' | 16 | 21 | |
| 30 | '2012-8-1' | '2012-8-15' | 12 | 22 | |
Interrogazione - 1
Mostrare i numeri delle stanze occupate nel tempo da tutti gli ospiti provenienti da 'Caserta'.
from localita, ospiti, stanze, ospitiSuStanze
where
(localita.nome = 'Caserta') and
(localita.id = ospiti.idlocalita) and
(ospiti.id = ospitiSuStanze.idOspite) and
(ospitiSuStanze.idStanza = stanze.id)
| numero |
|---|
| 300 |
| 202 |
| 100 |
| 201 |
Interrogazione - 2
Mostrare un elenco (per piano) di tutte le stanze che fornisca piano, numero e metratura.
from stanze
order by piano
| piano | numero | metratura |
|---|---|---|
| 1 | 100 | 20 |
| 1 | 101 | 30 |
| 1 | 102 | 30 |
| 2 | 200 | 20 |
| 2 | 201 | 30 |
| 2 | 202 | 30 |
| 3 | 300 | 60 |
Interrogazione - 3
Mostrare nome e cognome di tutti gli ospiti che hanno occupato nel tempo stanze più grandi di 25 mq.
from ospiti as h, stanze as s, ospitiSuStanze as k
where (s.metratura > 25) and (s.id = k.idStanza) and (k.idOspite = h.id)
| nome | cognome |
|---|---|
| Raffaele | Cennamo |
| Giorgio | Feola |
Interrogazione - 4
Mostrare i periodi di permanenza presso la struttura della famiglia 'De Santis'.
from ospiti, ospitiSuStanze
where (ospiti.cognome = "De Santis") and (ospiti.id = ospitiSuStanze.idOspite)
| inizio | fine |
|---|---|
| '2011-8-20' | '2011-9-5' |
Interrogazione - 5
Mostrare un elenco ordinato di tutte le stanze a cui è stato in qualche circostanza aggiunto un letto. Per ciascuna stanza si mostrino tutte le aggiunte.
from stanze as s, ospitiSuStanze as k
where (k.idStanza = s.id) and (ospitiSuStanze.lettiAggiuntivi is not NULL)
order by numero
| numero | maxLettiAggiuntivi | lettiAggiuntivi |
|---|---|---|
| 100 | 2 | 1 |
| 100 | 2 | 2 |
| 200 | 2 | 1 |
Nota.
Quando non si riempie un campo opzionale questo contiene il valore speciale NULL. Per verificare che un valore sia uguale o non uguale a null si può usare il costrutto is o is not.
Challenge
Challenge - 1
Qual è il risultato di questa select?
from localita, province
where (localita.idProvincia = province.id) and (province.nome = "Caserta")
order by localita.nome
Challenge - 2
Qual è il risultato di questa select?
from localita, province
where (localita.idProvincia = province.id) order by localita.nome
Challenge - 3
Creare una query che mostri cognome, nome e indirizzo completo di tutti gli ospiti del nostro database.
Challenge - 4
Creare una query che mostri cognome, nome e indirizzo completo di tutti gli ospiti che nel tempo hanno soggiornato in una stanza al secondo piano.
Challenge - 5
Creare una query che restituisca il numero della stanza (o delle stanze) in cui hanno soggiornato i clienti della famiglia "Feola" nell'anno 2010.