# Esercizi sul modello relazionale (superiori)

I seguenti esercizi riguardano Modello Relazionale studiati nella Lezione 5 della Parte Seconda. Essi sono divisi per paragrafi in modo tale da favorire la scelta degli esercizi specifici.

## Es Concessionaria Moto

Si vuole costruire un database per aiutare un concessionario di moto nella sua attività . Nel database si vogliono registrare i dati anagrafici dei clienti e i contratti dei clienti che acquistano le moto. Le moto presenti nella concessionaria appartengono a una o più categorie (125, 250, 500, cross, motard,custom, etc) e sono state acquistate dalle principali case motociclistiche (Honda, Kawasaki,Aprilia, Ducati) tramite un distributore di zona.
* MODELLO E/R
* Modelloer
* MODELLO RELAZIONALE
* Vediamo ora le tabelle (relazioni) che si devono implementare nel database
| Clienti |
| NomeCampo | Tipo | Informazioni |
| IDCliente | intero | chiave primaria |
| Nome | testo | |
| Cognome | testo | |
| Codicefiscale | testo | |
| Moto |
| NomeCampo | Tipo | Informazioni |
| IDMoto | intero | chiave primaria |
| Colore | testo | |
| Prezzo | valuta | |
| IDCliente | intero | chiave esterna |
| IDAziende | intero | chiave esterna |
| Azienda Motociclistica |
| NomeCampo | Tipo | Informazioni |
| IDAziende | intero | chiave primaria |
| Nome | testo | |
| Responsabile | testo | |
| Categorie |
| NomeCampo | Tipo | Informazioni |
| IDCategorie | intero | chiave primaria |
| Descrizione | testo | |
| SelezioneCategoria |
| NomeCampo | Tipo | Informazioni |
| IDMoto | intero | chiave esterna |
| IDCategorie | intero | chiave esterna |

## Es Agenzia Immobiliare

Agenzia Immobiliare: Un'agenzia immobiliare vuole gestire le sue attività aiutandosi con un database. L'agenzia vuole registrare i dati anagrafici dei suoi clienti e i dati delle unità immobiliari che tratta . Un cliente può comprare tutto un immobile o una quota di esso. Le unità immobiliari appartengono a una specifica tipologia (terreni, case, ville e appartamenti, etc). Le persone che hanno messo in vendita (venditori) l'immobile tramite l'agenzia ne possiedono sempre l'intera proprietà.
MODELLO E/R
Per costruire il modello E/R è necessario individuare le entità con i rispettivi attributi, le associazioni e le proprietà delle associazioni (grado e opzionalità).
MODELLO RELAZIONALE
Nell'immagine sono rappresentate alcune tabelle, ciascuna di esse rappresenta un'entità. Nel secondo campo è inserito il tipo di dato e nel terzo campo alcune informazioni aggiuntive come PK (primary key / chiave primaria)e FK (foreign key/ chiave esterna).
Si ricorda che le associazioni 1:N o N:1 portano alla creazione di un campo nella tabella lato "a molti" che contiene una chiave esterna che si collega con una chiave primaria nella tabella lato "a uno". Le associazioni N:N portano invece alla creazione di una tabella che contiene due chiavi esterne di cui una collegata alla chiave primaria della prima tabella e una alla chiave primaria della seconda tabella, più eventuali attributi che riguardano delle associazioni.

## Es1 PrenotazioneVaporetto
### Agenzia NaveBlu

L'agenzia NaveBlu di Portotolle cura la vendita ai turisti di viaggi lungo il Po a bordo delle barche dei Pescatori del luogo. Ciascun viaggio dura un sol giorno. Ogni Pescatore ha una sola barca con un certo numero di posti disponibili e il viaggio si snoda lungo un itinerario prefissato che tocca caratteristiche località del Delta Polesano .Ogni Itinerario ha una sequenza di località decisa dal Capitano della Nave , che può essere riproposta anche in giorni diversi. Ogni capitano può offrire più itinerari (in giorni diversi). Di ciascuna località visitata lungo un particolare itinerario vengono registrate diverse informazioni: una descrizione , due foto , 3 consigli su cosa visitare e un luogo dove poter mangiare del buon pesce.
L'agenzia che vende i biglietti per potersi imbarcare, deve poter visualizzare per una certo giorno l'elenco dei possibili itinerari con il numero di posti ancora disponibili. Ogni pescatore deve poter conoscere i nominativi delle persone che in una certa data si dovranno imbarcare. L'agenzia per un particolare itinerario relativo a un certo giorno deve poter visualizzare il numero di posti ancora disponibili. L'agenzia fissata una certa località e una certa data deve poter visualizzare i viaggi che la comprendono nel proprio itinerario. L'agenzia inoltre può stampare le informazioni di un particolare itinerario e il suo costo.
Definisci un database per gestire il servizio.
Soluzione:
* modello relazionale Pescatori
* 1) creare un elenco di tutti i pescatori ordinati (senso crescente) per nominativo
* select *
* from pescatori
* order by nominativo
* 2) creare un elenco dei pescatori ordinato (senso decrescente) per idpescatore che visualizzi idpescatore, nominativo e il nome
* della barca
* select idpescatore,nominativo,nomebarca
* from pescatori
* order by idpescadore DESC
* 3) visualizzare un elenco delle località che abbiano 2 foto, si vuole evidenziare idlocalità descrizione foto1 foto2 e
* ristorante
* select idlocalita , descrizione,foto1,foto2,ristorante
* from localita
* where foto1 is not null && foto2 is not null
* 4) trovare tutti i clienti (visualizzarli ordinati per cognome e nome) che hanno il cognome che inizia per R
* select cognome,nome,idcliente,telefono,indirizzo
* from clienti
* where cognome like 'R%'
* order by cognome,nome
* 5) visualizzare tutte le località ( idlocalita,descrizione e ristorante) di un itinerario di cui si conosce l'id è 5
* select dlocalita,descrizione,ristorante
* from localita join localitaitinerario on localita.idlocalita = localitaitinerario.idlocalita
* where localitaitinerario.iditinerario= 5
* oppure
* select dlocalita,descrizione,ristorante
* from localita , localitaitinerario
* where localitaitinerario.iditinerario= 5 AND localita.idlocalita = localitaitinerario.idlocalita
* 6) trovare tutti i viaggi che si svolgono fra il 12/1/2016 e il 14/1/2016 ordinati per prezzo il cui capitano sia il signor
* marco rossi (nominativo)
* select idviaggio,iditinerario,data,prezzo
* from viaggi join pescatori on viaggi.idpescatore=pescatori.idpescatore
* where nominativo='marco rossi' and dataviaggio between '12/1/2016' and '14/1/2016'
* order by prezzo
* 7) calcolare del viaggio con id=234 quanti posti sono stati prenotati ( calcolarlo mediante le prenotazioni effettuate)
* select sum(persone)
* from prenotazioni
* where idviaggio=234
* commenta la presenza della voce posti prenotati nella tabella viaggi
* 8) calcolare quante prenotazioni ha fatto il signor marco rossi (pensiamo sia l'unico cliente con questo nome)
* select count(*)
* from prenotazioni join clienti on prenotazioni.idcliente = clienti.idcliente
* where cognome='rossi' and nome='marco'
* 9) per ogni pescatore calcolare quanti sono stati i viaggi svolti nel mese di gennaio 2013
* select idpescatore, count(*)
* from viaggi
* where dataviaggio between '1/1/2013' and '31/1/2013'
* group by idpescatore
* 10) visualizza il viaggio ( con tutte le informazioni) più costoso di oggi
* select top 1 *
* from viaggi
* where dataviaggio= now
* order by costo
* 11) visualizza tutti i viaggi che si svolgono il 2/3/2016 e che hanno fra le località del loro itinerario "boccasette" (
* boccasette è una parola presente nella descrizione della località
* select idviaggio, iditinerario
* from viaggi,itinerario,localitaitinerario,localita
* where viaggi.iditinerario=itinerario.iditinerario and itinerario.iditinerario=localitaitinerario.iditinerario and
* localitaitinerario.idlocalita = localita.idlocalita and localita.descrizione like '%boccasette%
* and viaggi.dataviaggio='2/3/2016'
* 12) trova il nominativo del pescatore più anziano
* select nominativo
* from pescatori
* where datanascita = ( select min(datanascita)
* from pescatori
* 13) visualizza tutti i clienti con i posti prenotati da ciascuno per il viaggio 345 (evidenzia lo stato del pagamento)
* select idcliente,cognome,nome, persone,pagato
* from clienti,prenotazioni
* where clienti.idcliente=prenotazioni.idcliente AND idviaggio=345
* 14) si vuole stampare il percorso (localita dopo localita) di un particolare itinerario discuti del problema che sorge nel
* ottenere questa informazione e indica il rimedio
* 15) visualizza ogni pescatore che ha visto salire a bordo il cliente 1234 un numero di volte maggiore di 3
* select idpescatore
* from prenotazioni,viaggi
* where prenotazioni.idviaggio = viaggi.idviaggio and idcliente= 1234
* group by idpescatore
* having count(*)> 3
* 16) visualizza tutti i dati di un cliente il cui id viene scelto al momento dell'interrogazione
* select *
* from clienti
* where idcliente=[inserisci id cliente]

## Es2 InterrogazioniPianificate
### Interrogazioni Pianificate

Antonio detto Pisolo è stanco di dover fare più compiti o interrogazioni nello stesso giorno e ha deciso di scrivere un database per aiutare gli insegnanti a pianificare le interrogazioni e i compiti scritti. Ogni insegnante della sua classe può vedere gli studenti che possono essere interrogati in un certo giorno , visualizzando per primi quelli con meno interrogazioni .
Uno studente nel giorno in cui è fissata una prova scritta o una interrogazione non può essere sottoposto ad altre prove.Nel database vengono registrate le valutazioni delle prove sostenute. Ogni insegnante insegna una sola materia.
Il database permette ad ogni studente di visualizzare in un certo intervallo di tempo quali sono le verifiche da sostenere.
Definisci un database per gestire il servizio. Soluzione:

## Es2 TaglioFashion
### TaglioFashion

Antonella ha un negozio di parucchiera il suo negozio TaglioFashion è molto di moda e i clienti non mancano, per evitare attese troppo lunghe ha deciso di offrire il servizio solo su appuntamento.Vuole che i clienti fissino gli appuntamenti specificando i possibili servizi che sono: taglio, casco e trucco. Ha prestabilito che per un taglio impiega 20 minuti, per il casco 30 e per il trucco 40 minuti, ad ogni registrazione il computer indica l'orario in cui presentarsi. Il negozio apre alle ore 9:00 e lei lavora senza pause per 8 ore. I clienti possono scegliere il giorno dell'appuntamento ma non l'orario.
Antonella può per ciascun giorno visualizzare i nomi dei clienti, l'orario e i servizi richiesti. Può anche vedere i clienti che nel mese hanno utilizzato per più tempo i suoi servizi e il guadagno fatto a fine di ciascuna giornata, decidi tu il costo dei 3 servizi
Definisci un database per gestire il servizio.
Soluzione