DataBase - Enrico De Biasi

Transcript

DataBase - Enrico De Biasi
3
parte prima
Progettazione della base di dati
Modellazione
dei dati
OBIETTIVI DI APPRENDIMENTO
In questo capitolo potrai comprendere l’importanza della
modellazione dei dati al livello concettuale.
Imparerai a utilizzare nella pratica le tecniche per la
definizione del modello di dati, individuando entità,
attributi e associazioni. Sarai anche in grado di
documentare l’analisi di un problema in modo efficace
attraverso il modello entità/associazioni.
© Istituto Italiano Edizioni Atlas
Progettazione concettuale
Livelli di modellazione
Entità e associazioni
Attributi
Associazioni tra entità
Regole di lettura
Documentazione dell’analisi
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
1 Introduzione
Nel precedente capitolo abbiamo descritto le tecniche per raccogliere le richieste degli utenti
di un’applicazione informatica. Il passo successivo consiste nello sviluppare la base di dati
dell’applicazione. Sviluppo che passa attraverso diverse fasi di progettazione dette progettazione concettuale, organizzazione logica e implementazione fisica.
La progettazione concettuale è la sintesi tra la visione degli utenti e la visione dei progettisti
dell’applicazione. Deve possedere due caratteristiche antitetiche: da una parte deve essere
assolutamente precisa per non lasciare dubbi in merito alla caratteristiche della base di dati
che si sta progettando, dall’altro deve essere espressa tramite formalismi sufficientemente
semplici da permetterne la lettura e la comprensione anche da parte di utenti non tecnici. Gli
utenti devono infatti essere certi che i progettisti abbiano compreso a fondo tutte le loro
esigenze.
Il modello Entità/Associazioni presenta tali caratteristiche e si concretizza in un documento
con rappresentazioni grafiche, come quella in figura, che verranno spiegate nei paragrafi
successivi.
Fornitore
CodFornitore {PK}
Nominativo
Via
Città
CAP
1
Fornire
DataAcquisto
Quantità
N
Prodotto
CodProdotto {PK}
Descrizione
Prezzo
Lo scopo di questo capitolo è di descrivere i concetti e i formalismi utilizzati nella costruzione
del modello entità/associazioni.
Il modello entità/associazioni, pur essendo di gran lunga il modello più utilizzato nella progettazione concettuale, non ha una rappresentazione standardizzata. Quando si parla di modello
entità/associazioni tutti sono concordi nel ritenere che nel modello devono comparire entità,
associazioni e attributi, e che cosa si intenda con tali termini: esistono però diversi modi di
rappresentarli in un modello.
In questo testo sarà utilizzata una forma di rappresentazione grafica basata sull’Unified
Modeling Language (UML).
L’UML (linguaggio unificato di modellazione), è un linguaggio grafico per visualizzare,
definire, specificare e documentare tutte le costruzioni di sistemi software.
L’UML è stato approvato da parte del comitato OMG (Object Management Group) ed è un
linguaggio di modellazione e specifica molto diffuso per la descrizione di sistemi software
object oriented. Nel presentare il modello entità/associazioni indicheremo anche quali sono gli
altri formalismi maggiormente diffusi.
Occorre osservare che il modello entità/associazioni è da molti indicato con il nome di modello
entità/relazioni. Il termine relazione è utilizzato, in tal caso, come sinonimo di associazione,
ossia per indicare un collegamento logico tra entità differenti. Ma il termine relazione è
importante nell’ambito del modello relazionale dei dati, dove assume un significato completamente diverso. Per evitare ambiguità, in questo testo, viene utilizzato sempre il termine entità/
associazioni per indicare questo tipo di modello.
108
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
2 Modellazione dei dati
Modellare i dati significa costruire una rappresentazione semplificata della realtà osservata o di un problema aziendale, individuandone gli elementi caratterizzanti e i legami
intercorrenti tra essi.
La progettazione di un modello di dati avviene a livelli diversi:
• il livello concettuale (o esterno) rappresenta la realtà dei dati e le relazioni tra essi attraverso uno schema.
• il livello logico rappresenta il modo attraverso il quale i dati sono organizzati negli archivi:
descrive quindi la composizione e il formato dei dati nel loro aspetto di struttura logica di dati.
Il livello logico viene derivato dal livello concettuale applicando alcune semplici regole di
trasformazione.
• il livello fisico rappresenta l’effettiva installazione degli archivi su disco: esso indica l’ubicazione
dei dati nelle memorie di massa. Il livello fisico è quindi l’implementazione del livello logico
sui supporti per la registrazione fisica dei dati e si occupa di oggetti quali: partizioni, puntatori,
blocchi fisici, cluster, indici.
L’attività di progettazione consente prima di tutto di costruire una rappresentazione astratta
della realtà in modo indipendente dalla struttura dei dati.
Il modello concettuale viene definito attraverso lo schema dei dati, cioè una rappresentazione
sintetica (di solito presentata in forma grafica) degli elementi fondamentali che caratterizzano
la realtà osservata. Questa rappresentazione è indipendente da:
• i valori che verranno assegnati ai dati;
• le applicazioni degli utenti che utilizzano i dati;
• le visioni parziali dei dati da parte degli utenti.
Il modello concettuale rappresenta un patrimonio importante per le aziende, poiché descrive
i dati esistenti in azienda: il suo valore informativo può essere utilizzato sia nel campo informatico
sia nell’ambito gestionale e diventa un supporto per i diversi ruoli aziendali.
© Istituto Italiano Edizioni Atlas
109
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Con il passaggio al modello logico, l’insieme dei dati viene
dotato di una struttura che deve facilitare:
• la manipolazione o il trattamento dei dati, cioè la possibilità di inserire, modificare e cancellare i dati;
• l’interrogazione, cioè la possibilità di ritrovare i dati, richiesti da un’applicazione, in modo semplice e veloce.
Queste strutture di dati vengono poi implementate sulle
memorie di massa, realizzando in pratica il modello fisico,
rappresentato dai file registrati nei blocchi del disco.
Riassumendo, a partire dalla realtà considerata, vengono
individuati i dati che sono significativi, nel senso che sono
caratterizzanti, e viene definito lo schema concettuale rappresentativo della realtà.
Le strutture logiche dei dati, derivate dallo schema concettuale, vengono implementate e memorizzate negli archivi su
un supporto fisico di registrazione (memorie di massa).
Il modello entità/associazioni (in inglese Entity/Relationship), introdotto nel 1976 dal
matematico Peter P. Chen, è uno strumento per analizzare le caratteristiche di una realtà
in modo indipendente dagli eventi che in essa accadono, cioè per costruire un modello
concettuale dei dati indipendente dalle applicazioni.
Il risultato di questo lavoro è la definizione di una rappresentazione grafica, detta schema E/R
(Entity/Relationship), che mette in evidenza gli aspetti fondamentali del modello concettuale,
con i dati caratterizzanti e le associazioni tra essi.
Esso diventa uno strumento molto utile nel realizzare la transizione dalla descrizione di un
problema allo schema formale degli archivi. Il modello descrive lo schema concettuale di un
problema o di una gestione aziendale e non si occupa dell’efficienza delle operazioni di
manipolazione e ritrovamento dei dati sugli archivi fisici. Risulta di facile comprensione anche
per persone che non si occupano di computer ed è sostenuto da alcuni concetti e regole che
lo rendono preciso e rigoroso.
Gli elementi di un modello entità/associazioni sono:
• entità,
• associazioni,
• attributi.
3 Entità e associazioni
L’entità è un oggetto (concreto o astratto) che ha un significato anche quando viene
considerato in modo isolato ed è di interesse per la realtà che si vuole modellare.
Esempi di entità sono: una persona, un modello di automobile, un movimento contabile, una
prova sostenuta da uno studente.
Le entità possono essere classificate secondo un certo criterio di omogeneità definendo il tipo
di entità attraverso un nome.
110
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Per esempio gli studenti di una scuola sono classificabili nel tipo entità Studente, i diversi
modelli di automobile sono classificabili nel tipo entità Automobile.
Ciascuno studente rappresenta un’istanza dell’entità Studente.
Quindi l’istanza è un esemplare dell’entità.
Nella rappresentazione grafica le entità sono identificate con un rettangolo contenente all’interno il nome dell’entità.
Persona
Automobile
Studente
L’associazione (in inglese relationship) è un legame che stabilisce un’interazione tra le
entità.
Nella figura sottostante sono rappresentate le due entità Persona e Automobile con le relative
istanze e un insieme di archi per indicare l’associazione di possesso che si viene a stabilire tra
le persone e le automobili.
L’associazione ha nome Possedere e ha un verso che è specificato tramite le frecce che
collegano l’entità Persona con l’entità Automobile.
Persona
P1
Automobile
Possedere
A1
P2
A2
P3
A3
Dalla figura si vede che P1 possiede le automobili A1 e A2, P2 non possiede alcuna automobile
mentre P3 possiede l’automobile A3. Descriviamo questa situazione in linguaggio naturale con
le seguenti frasi: una persona può possedere una o più automobili; un’automobile è posseduta
da una sola persona.
Possiamo dire che tra l’entità Persona e l’entità Automobile esiste l’associazione Possedere.
La rappresentazione grafica convenzionalmente usata per indicare un’associazione è una linea
che unisce le due entità interessate; il nome dell’associazione compare sulla linea con il
simbolo della punta di una freccia per indicare il senso di lettura della associazione.
Nome e verso di lettura dell’associazione
Persona
Possedere
Automobile
Di norma i nomi delle entità sono sostantivi mentre i nomi delle associazioni sono verbi, in
questo modo si cerca di stabilire una corrispondenza tra rappresentazione delle associazioni
e frasi del linguaggio naturale che le descrivono.
© Istituto Italiano Edizioni Atlas
111
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Tra l’entità Persona e l’entità Automobile esiste l’associazione Possedere; l’associazione tra
l’entità Automobile e l’entità Persona può essere descritta mediante la forma passiva del verbo
che rappresenta la precedente associazione. Quindi tra l’entità Automobile e l’entità Persona
esiste l’associazione EsserePosseduta che non è rappresentata esplicitamente nel grafico.
L’esempio mostra la tecnica adottata dal linguaggio UML per rappresentare le associazioni. Il
nome dell’associazione rappresenta uno solo dei due versi dell’associazione, quello nel quale
la lettura ha senso; il verso è precisato con il simbolo a forma di punta di freccia posto accanto
al nome. Conveniamo che il nome del verso non rappresentato sia (nella maggior parte dei
casi) lo stesso verbo posto nella forma passiva.
Possedere
Persona
EsserePosseduta
Automobile
Nome dell’associazione non rappresentata
Il modello entità/associazioni è diffuso a livello internazionale con diverse rappresentazioni
formali. Un simbolismo differente è il seguente:
Persona
Possiede
Posseduta da
Automobile
nel quale sono descritti con nomi opportuni entrambi i versi dell’associazione. Il verbo che
descrive l’associazione è posto di fianco all’entità di partenza del verso.
Un altro simbolismo usato per descrivere un’associazione è dato da una linea che unisce le due
entità con l’aggiunta, a metà della linea, di un rombo che contiene la descrizione dell’associazione.
Possiede
Persona
Automobile
Le associazioni hanno un grado. Il grado è dato dal numero di entità che partecipano all’associazione. L’associazione tra Automobile e Persona è un’associazione di grado 2, detta associazione binaria ma, naturalmente, esistono associazioni di grado 1, 3 e di grado superiore.
Nel seguito si parlerà di associazioni binarie che sono le associazioni più diffuse.
Due entità possono essere collegate da più di un’associazione come nel caso delle entità
Docente e Classe tra le quali esistono le due associazioni Insegnare e Coordinare. In questo
caso nella rappresentazione si possono evidenziare, mediante un nome, i ruoli che le entità
giocano nelle due associazioni. Nell’esempio si evidenzia che l’entità Docente si presenta nei
ruoli di nome Insegnante e Coordinatore nelle due associazioni. Questo ci permette di affermare che: un insegnante può insegnare in una o più classi; un coordinatore può coordinare una
classe.
Insegnante
Nome dei ruoli
nelle due associazioni
Docente
Coordinatore
112
Insegnare
Classe
Coordinare
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
LE ASSOCIAZIONI RICORSIVE
Ci sono associazioni tra un’entità e se stessa: si consideri per esempio l’entità Persona e
l’associazione di maternità (o paternità) che collega una madre con i propri figli (o un padre
con i propri figli). In queste associazioni l’entità Persona partecipa con ruoli diversi all’associazione. Le associazioni di questo tipo si dicono associazioni ricorsive.
L’associazione in figura è un altro esempio di associazione ricorsiva nella quale l’entità
Dipendente partecipa all’associazione Coordinare nel duplice ruolo di Supervisore e di
Collaboratore.
Coordinare
Supervisore
Collaboratore
Dipendente
Utilizzando i nomi dei diversi ruoli che un dipendente assume nell’associazione Coordinare,
la realtà descritta in figura può essere espressa in linguaggio naturale con le frasi: un
supervisore può coordinare uno o più collaboratori; un collaboratore può essere coordinato
da un supervisore.
4 Gli attributi
Le proprietà delle entità e delle associazioni sono descritte attraverso gli attributi.
Esempi di attributi per l’entità Automobile sono: Modello, Produttore, Cilindrata, Potenza,
PrezzoListino.
Le caratteristiche di ogni attributo sono il formato, la dimensione e l’opzionalità:
• il formato di un attributo indica il tipo di valori che assume; i tre formati di base sono:
carattere, numerico, data/ora.
• la dimensione indica la quantità massima di caratteri o cifre inseribili.
• l’opzionalità indica la possibilità di non essere sempre valorizzato: l’attributo è obbligatorio se
deve avere valore non nullo (per esempio il nome di una persona in un’anagrafica), facoltativo
se sono accettabili valori nulli (per esempio il titolo di studio di una persona).
Il valore nullo, in inglese Null, (da non confondere con la stringa di caratteri blank o con un
numero di valore zero) rappresenta un’informazione mancante in quanto inapplicabile (per
esempio il numero del certificato elettorale di un/una quindicenne) o sconosciuta (la data
effettiva di consegna di una merce ordinata e non ancora arrivata in magazzino).
I diversi valori assunti dagli attributi determinano le diverse istanze dell’entità. L’insieme dei
possibili valori assunti da un attributo si chiama dominio dell’attributo. I valori appartenenti al
dominio sono omogenei tra loro, cioè sono dello stesso tipo.
Gli attributi sono elencati nella parte inferiore del rettangolo che rappresenta l’entità, con una
linea di demarcazione tra il nome dell’entità e la lista di attributi. La figura rappresenta l’entità
Automobile con i relativi attributi.
Automobile
Modello
Produttore
Cilindrata
Potenza
PrezzoListino
© Istituto Italiano Edizioni Atlas
113
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Le associazioni possono avere attributi. Si consideri per esempio l’associazione di nome
Acquistare che associa una persona all’automobile acquistata. L’acquisto avviene in una certa
data (DataAcquisto) e a un certo prezzo (PrezzoAcquisto).
Il prezzo di acquisto non è un attributo di Automobile (un automobile è caratterizzata da un
prezzo di listino, ma potrebbe avere un prezzo di acquisto differente per ogni vettura venduta).
Analogamente non è un attributo della persona.
Un ragionamento analogo si può fare per l’attributo DataAcquisto. Si può dire che i due attributi
sono caratteristici dell’abbinamento tra una persona e l’automobile acquistata, cioè dell’associazione Acquistare tra le entità Persona e Automobile. La rappresentazione UML di questa
situazione è la seguente:
Nome dell’associazione
Persona
CodiceFiscale
Cognome
Nome
DataNascita
Indirizzo
Attributi dell’associazione
Acquistare
DataAcquisto
PrezzoAcquisto
Automobile
Modello
Produttore
Cilindrata
Potenza
PrezzoListino
Nella rappresentazione UML gli attributi dell’associazione compaiono nella parte inferiore di un
riquadro identico a quello usato per rappresentare le entità, collegato alla linea che rappresenta
l’associazione.
Il nome dell’associazione è riportato sulla linea che collega le entità; lo spazio, che nel caso
delle entità è occupato dal nome, rimane vuoto.
Si osservi che la presenza di un’associazione con attributi potrebbe essere indicativa della
presenza di un’altra entità oltre a quelle identificate. Per esempio, un progettista di dati
potrebbe modellare la precedente situazione per mezzo delle entità Persona, Automobile,
Acquisto e di due associazioni che collegano le tre entità: una tra Persona e Acquisto e una tra
Acquisto e Automobile.
Persona
CodiceFiscale {PK}
Cognome
Nome
DataNascita
Indirizzo
Trattare
Acquisto
DataAcquisto
PrezzoAcquisto
Acquistare
Automobile
Modello
{PK}
Produttore
Cilindrata
Potenza
PrezzoListino
È importante sottolineare che la differente visione del problema non porta a una rappresentazione corretta in un caso ed errata nell’altro. Non solo, come vedremo nel prossimo capitolo,
applicando le regole di passaggio dal modello concettuale al modello logico, le due rappresentazioni portano alle stesse strutture di dati.
Una regola molto importante richiede di definire solo gli attributi elementari e quindi di non
definire gli attributi che si ottengono con le elaborazioni, cioè gli attributi derivati. Il mancato
rispetto della regola provoca inefficienza dovuta alle elaborazioni necessarie per aggiornare
questo tipo di attributi. Per esempio l’età di una persona è un attributo derivato dall’attributo
elementare della data di nascita; il saldo di un conto corrente è derivato dalla somma algebrica
degli importi dei movimenti effettuati sul conto.
114
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Si indica con il termine chiave o chiave primaria (primary key) un insieme minimale di
attributi che permettono di distinguere tra loro le istanze di una stessa entità.
Esempi di chiavi sono il codice di un prodotto, la matricola di un dipendente, la chiave composta dal codice studente insieme alla data e al codice della materia per le prove scolastiche. Nel
caso delle due entità Persona e Automobile gli attributi CodiceFiscale e Modello sono le chiavi
primarie per le entità Persona e Automobile.
La chiave primaria di un’entità viene riconosciuta dalla presenza dell’acronimo: {PK} (Primary
Key), posto tra parentesi graffe, accanto all’attributo chiave.
Nel caso di chiave formata da più attributi l’acronimo {PPK} (Partial Primary Key) è posto
accanto a ognuno degli attributi che compongono la chiave.
L’uso dei codici come chiave per identificare le istanze di un’entità è ormai abitudine consolidata nei moderni sistemi: ciò è dovuto anche al fatto che in modo sempre più esteso vengono
previsti, nell’automazione dei sistemi informativi, strumenti di rilevazione dei dati diversi dalla
tastiera (lettori di caratteri, scanner per codici a barre), più veloci e più affidabili nelle operazioni
di input.
Nelle altre rappresentazioni il simbolo grafico convenzionalmente usato per rappresentare
l’attributo è la linea che parte dall’entità e termina con il nome e un piccolo cerchio.
Nella descrizione grafica, gli attributi chiave vengono evidenziati sottolineandone il nome
oppure colorando il cerchietto dell’attributo.
Automobile
PrezzoListino
Cilindrata
Produttore
Modello
Nel caso del formalismo con il rombo si possono rappresentare gli attributi dell’associazione
collegando il simbolo dell’attributo al rombo che rappresenta l’associazione.
Persona
Acquista
DataAcquisto
Automobile
PrezzoAcquisto
ERIA
EB
W
LIBR
Nel caso del formalismo che non prevede l’uso del rombo non vi è modo di rappresentare gli
attributi di un’associazione e bisogna ricorrere a una nuova entità posta tra quelle collegate
dall’associazione, come abbiamo fatto nel caso dell’associazione Acquistare tra Persona e
Automobile.
Gli schemi entità/associazioni possono non contenere la rappresentazione grafica degli attributi per evitare un appesantimento nella lettura e nell’interpretazione di schemi complessi. In
questi casi una prassi altrettanto diffusa è quella di rappresentare solo l’attributo chiave delle
entità.
1. Entità deboli ed entità forti
© Istituto Italiano Edizioni Atlas
AUTOVERIFICA
Domande da 1 a 12 pag. 130-131
Problemi da 1 a 6 pag. 133
115
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
5 Le associazioni tra entità
La molteplicità di un’associazione è il numero di possibili istanze di un’entità che viene
messo in corrispondenza con un’istanza dell’altra entità che partecipa all’associazione.
Il numero minimo e massimo di possibili istanze viene rappresentato mediante una coppia di
valori separati da punti: 1..1, 0..1, 1..N. Al valore minimo e massimo sono associati gli importanti concetti di obbligatorietà e cardinalità dell’associazione:
• Il valore minimo assume, in genere, uno dei due valori 0 e 1. Lo 0 indica che la partecipazione
è facoltativa, mentre il valore 1 indica che la partecipazione è obbligatoria.
• Il valore massimo definisce la cardinalità della partecipazione all’associazione. Esso assume, in genere uno dei due valori 1 oppure N per indicare una o molte partecipazioni
all’associazione.
La cardinalità può quindi essere a uno oppure a molti e pertanto le associazioni tra due entità
si classificano nei seguenti tipi:
• associazione uno a uno o biunivoca, indicata con 1 : 1;
• associazione uno a molti, indicata con 1 : N;
• associazione molti a molti, indicata con N : N.
Non è sempre facile attribuire questi valori e solo un attento esame della specifica situazione
permette di definirli con esattezza.
Un metodo utile per risolvere i dubbi consiste nel rappresentare l’associazione con insiemi di
istanze delle entità collegate con archi, come mostrato negli esempi successivi.
a. Associazione 1:1 (uno a uno) o biunivoca
Un’associazione si dice uno a uno, o biunivoca, e si indica con 1 : 1, quando ogni istanza
della prima entità si deve associare a una sola istanza della seconda entità e viceversa.
Per esempio l’associazione tra l’entità Studente e l’entità Diploma, in una scuola superiore, è
biunivoca perché a ogni studente corrisponde un solo diploma e viceversa a un diploma
corrisponde un solo studente.
Consideriamo ora le entità Classe e Docente e l’associazione Coordinare che collega un
docente con la classe di cui è coordinatore. L’associazione può essere descritta come nella
figura seguente.
Classe
Docente
D1
D2
Coordinare
C1
C2
D3
D4
C3
D5
Molteplicità 0..1
116
Molteplicità 1..1
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Notiamo che ci sono docenti, come D3 e D5 che non partecipano all’associazione (non tutti i
docenti sono coordinatori) e che i docenti coordinano una sola classe. Il numero minimo di
istanze è 0 (partecipazione facoltativa), mentre la cardinalità è a uno, per il fatto che un
docente coordina una sola classe. Infatti per ogni elemento dell’insieme Docente non c’è
nessun arco diretto verso Classe oppure c’è al più un solo arco. La molteplicità è 0..1 (minima
0, massima 1).
Se analizziamo l’associazione nell’altro senso, notiamo che tutte le classi hanno un coordinatore e che a ogni classe è associato un solo coordinatore. Ogni classe partecipa all’associazione con almeno 1 istanza (partecipazione obbligatoria) e ogni classe partecipa al massimo
una sola volta all’associazione: la cardinalità è a uno. Infatti anche dall’insieme Classe parte
sempre un solo arco verso l’insieme Docente. La molteplicità è 1..1 (minima 1, massima 1).
Possiamo riassumere queste considerazioni dicendo che ogni classe deve essere coordinata
da un docente e che ogni docente può coordinare una sola classe.
La figura seguente illustra il modello E/R del problema analizzato.
1:1
Docente
1
1
Coordinare
Facoltativa
per Docente
Classe
Obbligatoria
per Classe
Per rappresentare il fatto che una classe è coordinata da un solo docente, scriviamo 1 di fianco
all’entità Docente e per rappresentare il fatto che un docente coordina una sola classe scriviamo 1 di fianco all’entità Classe. Questo sta a significare che l’associazione tra Docente e
Classe ha cardinalità a uno e che anche l’associazione tra Classe e Docente ha cardinalità a
uno. Inoltre la partecipazione di Classe è obbligatoria, mentre la partecipazione di Docente è
facoltativa.
Per ragioni di semplicità e di maggiore leggibilità, l’informazione in merito all’obbligatorietà o
meno della partecipazione sarà rappresentata nel seguito utilizzando una linea continua o
tratteggiata nel disegno dell’associazione. Una linea continua in partenza da un’entità indica la
partecipazione obbligatoria all’associazione, mentre una linea tratteggiata indica la partecipazione facoltativa. La rappresentazione adottata per l’associazione Coordinare è illustrata in
figura.
Partecipazione facoltativa di
Docente e obbligatoria di Classe
Docente
1
1
Coordinare
Classe
b. Associazione 1:N (uno a molti) o semplice
Un’associazione si dice uno a molti, o semplice, e si indica con 1 : N, quando ogni
istanza della prima entità si può associare a una o più istanze della seconda entità, mentre
a ogni istanza della seconda entità si deve associare una sola istanza della prima.
© Istituto Italiano Edizioni Atlas
117
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Per esempio nella gestione dei movimenti su un conto corrente, ogni conto può effettuare una
o più operazioni, ma ogni movimento deve riferirsi a un solo conto corrente. Quindi l’associazione Effettuare tra l’entità ContoCorrente e l’entità Movimento è uno a molti. Analizziamo in
dettaglio la situazione.
ContoCorrente
Movimento
C1
M1
Effettuare
C2
M2
C3
M3
Molteplicità 0..N
Molteplicità 1..1
Osservando gli archi in partenza dalle istanze di ContoCorrente possiamo dire che il numero
minimo di volte che il conto corrente viene associato ai movimenti è 0 (partecipazione facoltativa) e che la cardinalità è a molti. Infatti su un conto corrente si possono fare nessun
movimento o molti movimenti. La molteplicità è 0..N (minima 0, massima N).
Se osserviamo il diagramma dalla parte di Movimento, il numero minimo di istanze è 1, perché
tutti i movimenti devono riferirsi a un conto corrente (partecipazione obbligatoria). La cardinalità
è a uno, perché a un’ istanza di Movimento corrisponde una e una sola istanza di ContoCorrente.
La molteplicità è 1..1 (minima 1, massima 1).
Il diagramma E/R corrispondente è il seguente:
1:N
ContoCorrente
1
N
Effettuare
Facoltativa per
ContoCorrente
Movimento
Obbligatoria
per Movimento
Per rappresentare il fatto che un conto corrente può effettuare molti movimenti scriviamo N
vicino a Movimento e scriviamo 1 accanto all’entità ContoCorrente per rappresentare il fatto
che un movimento è associato a uno e un solo conto corrente. Questo sta a significare che
l’associazione tra ContoCorrente e Movimento è a molti, mentre l’associazione tra Movimento e ContoCorrente è a uno. Inoltre la partecipazione di Movimento è obbligatoria, mentre la
partecipazione di ContoCorrente è facoltativa.
Ci sono naturalmente casi nei quali sono noti valori meno generici di uno, nessuno e molti per
indicare la partecipazione di un’entità a una associazione. Consideriamo, per esempio, l’associazione Giocare che intercorre tra giocatori e squadre di calcio. Poiché una squadra di calcio
deve avere almeno 11 giocatori, la partecipazione dell’entità che rappresenta le squadre sarà
descritta con 11..N. Un altro esempio tratto dal mondo del calcio è dato dai guardalinee e dalle
partite di calcio. Com’è noto, in ogni partita sono presenti esattamente 2 guardalinee. La
molteplicità che ne deriva è: 2..2 (minimo 2, massimo 2).
118
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
La rappresentazione grafica adottata in questo testo per l’associazione uno a molti Effettuare
è illustrata nella figura seguente. Si osservi la presenza di due ulteriori linee sulla linea che
rappresenta l’associazione, che rafforza il simbolo N posto vicino alla parte molti dell’associazione (in gergo, zampa di corvo o crow’s foot).
ContoCorrente
1
N
Effettuare
Movimento
La rappresentazione dell’associazione uno a molti, attraverso una linea semplice vicino all’entità ContoCorrente e le tre linee vicino all’entità Movimento, può intuitivamente ricordare, in
forma schematica, gli archi multipli che possono partire dagli elementi nell’insieme dei conti
correnti verso l’insieme dei movimenti.
c. Associazione N:N (molti a molti) o complessa
Un’associazione si dice molti a molti, o complessa, e si indica con N:N, se a ogni
istanza della prima entità si possono associare una o più istanze della seconda entità e a
ogni istanza della seconda entità si possono associare una o più istanze della prima.
Consideriamo per esempio le entità Docente e Classe e l’associazione Insegnare che associa
i docenti di una scuola alle classi dove insegnano:
Docente
Classe
D1
D2
Insegnare
C1
D3
D4
C2
D5
Molteplicità 0..N
Molteplicità ?..N
Ogni docente insegna in più classi e in ogni classe insegnano più docenti.
La situazione dalla parte docenti è chiara: un docente può insegnare in una o più classi ma
potrebbe anche non insegnare in alcuna classe, avendo incarichi di altro tipo, come il docente
D2. Il numero minimo di istanze è 0 (partecipazione facoltativa) e la cardinalità è a molti. Infatti
a un’istanza di Docente corrispondono più istanze di Classe. La molteplicità è 0..N (minima 0,
massima N).
Se analizziamo l’associazione partendo dalle classi ci troviamo di fronte alla difficoltà di
definire il numero minimo di docenti per una classe. Abbiamo indicato la situazione lasciando
un “?” al posto del valore minimo di istanze. Per superare la difficoltà dobbiamo specificare
meglio il contesto nel quale è collocata l’associazione. Supponiamo che il caso in esame sia
quello di un complesso scolastico formato da una scuola media inferiore e da una scuola
elementare. Di conseguenza non ci sono mai meno di 2 docenti per classe. Questo porta a
definire il numero minimo di istanze a 2 con partecipazione obbligatoria. Inoltre la cardinalità
è a molti, perché a ogni classe corrispondono più insegnanti. La molteplicità è 2..N (minima 2,
massima N).
© Istituto Italiano Edizioni Atlas
119
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Il diagramma E/R del problema considerato è il seguente:
N:N
N
Docente
N
Classe
Insegnare
Facoltativa
per Docente
Obbligatoria
per Classe
Accanto all’entità Docente scriviamo N e accanto all’entità Classe scriviamo N. Questo sta a
significare che l’associazione tra Docente e Classe è a molti e anche l’associazione tra Classe
e Docente è a molti.
Inoltre la partecipazione di Docente è facoltativa, mentre la partecipazione di Classe è obbligatoria.
Il diagramma E/R, nella forma adottata in questo testo per indicare l’associazione molti a molti
è la seguente:
N
Docente
N
Classe
Insegnare
Facoltativa
per Docente
Obbligatoria
per Classe
Occorre osservare che nella modellazione dei dati con l’approccio E/R le associazioni 1:N sono
molto più frequenti delle associazioni di tipo uno a uno e molti a molti. L’associazione molti a
molti, inoltre, può essere facilmente scomposta in due associazioni uno a molti come nel
seguente caso.
Consideriamo le entità Studente e Materia e l’associazione Valutare con attributi la data della
valutazione e il voto conseguito dallo studente in una data materia. Si tratta di un’associazione
molti a molti, in quanto uno studente può essere valutato in una o più materie e ogni materia
può essere oggetto di verifica per uno o più studenti. Introducendo una terza entità Prova,
avente come attributi la data e il voto della verifica, si arriva al modello E/R in figura nel quale
compaiono le due associazioni Svolgere e Assegnare di tipo uno a molti.
1:N
Studente
1
N:1
N
Svolgere
Prova
N
1
Assegnare
Materia
L’associazione tra Studente e Prova è di tipo 1:N, in quanto ogni studente può svolgere una o
più prove e ogni prova deve essere svolta da un solo studente; l’associazione tra Materia e
Prova è di tipo 1:N, perché ogni materia si può controllare con una o più prove e ogni prova
deve essere assegnata a una sola materia. L’associazione molti a molti è stata trasformata in
due associazioni uno a molti, con l’aggiunta di una terza entità.
120
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
6 Regole di lettura
Dopo aver definito lo schema E/R con le entità e le associazioni, con opzionalità, obbligatorietà
e cardinalità, è opportuno effettuare un controllo del modello usando frasi del linguaggio
naturale.
Per entrambi i versi di ciascuna associazione si usano le seguenti regole di lettura.
Ogni
Nome
dell’entità
di partenza
deve
Nome
dell’associazione
può
uno solo
uno o più
Nome
dell’entità
di arrivo
Lo schema rappresenta graficamente la traccia per costruire correttamente una frase che
rappresenta in linguaggio naturale l’associazione tra due entità. La frase risultante ha la
seguente struttura sintattica.
Ogni
Nome
dell’entità
di partenza
 deve 


 può 
Nome
dell’associazione
 uno solo 


 uno o più 
Nome
dell’entità
di arrivo
La scelta alternativa delle parole deve piuttosto che può dipende dalla obbligatorietà o meno
della partecipazione dell’entità di partenza dell’associazione.
La scelta alternativa delle parole un solo piuttosto che uno o più dipende dalla presenza di un
1 o di una N vicino all’entità di arrivo (linea unica o multipla).
Per migliorare la correttezza della lettura è opportuno convertire al plurale il nome dell’entità di
arrivo nel caso in cui si utilizzino le parole uno o più.
Le regole di lettura devono essere provate in entrambi i sensi dell’associazione. Il nome
dell’associazione ha un verso. Quando si cambia verso di lettura bisogna trasformare il verbo
che rappresenta l’associazione nella sua forma passiva.
Per esempio l’associazione tra l’entità Fornitore e l’entità Prodotto rappresentata con lo schema E/R in figura:
Fornitore
1
N
Fornire
Prodotto
Viene letta nel seguente modo:
Ogni fornitore può fornire uno o più prodotti
Ogni prodotto deve essere fornito da un solo fornitore
La correttezza sintattica delle frasi costruite dipende molto dal nome scelto per l’associazione.
In alcuni casi può essere necessario trasformare il verbo che dà il nome all’associazione,
portandolo in altra forma verbale, per rendere la frase più vicina al linguaggio naturale.
Il controllo del modello E/R attraverso le regole di lettura diventa più efficace se le frasi del
linguaggio naturale, ricavate dalla lettura del modello, vengono presentate a una persona
diversa da quella che ha progettato lo schema E/R, meglio se esperta del problema trattato nel
modello di dati.
© Istituto Italiano Edizioni Atlas
121
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Se le frasi risultano incomprensibili o prive di significato, significa che il modello contiene errori
nella scelta delle entità, nei versi o nella molteplicità delle associazioni.
Si provi, per esercizio, a modificare uno degli schemi E/R precedenti, inserendo entità errate
o scambiando associazioni di molteplicità uno a molti in associazioni molti a uno: applicando
le regole di lettura si otterranno frasi che non hanno significato o che non sono corrette se
riferite al problema considerato.
Per esempio, se pensiamo alle vetture che si trovano in un certo istante in una data via di una
città e i passeggeri che occupano tali vetture, descriviamo questa situazione dicendo: “ogni
vettura può essere occupata da uno o più passeggeri e un passeggero deve occupare una ed
una sola vettura”. Supponiamo adesso di descrivere (erroneamente) questi fatti con il modello
E/R in figura.
Passeggero
1
N
Occupare
Vettura
Applicando al modello le regole di lettura si ottengono le seguenti frasi:
Ogni passeggero può occupare una o più vetture
Ogni vettura deve essere occupata da un solo passeggero
Esse non descrivono la situazione reale perché: oltre alle vetture in movimento ci possono
essere vetture parcheggiate, e quindi senza passeggeri, ci possono essere vetture con più di
un passeggero e, infine, in un dato istante un passeggero occupa una sola vettura. Si può
invece verificare che, applicando le regole di lettura allo schema sottostante, si costruiscono
frasi che descrivono correttamente la situazione ipotizzata.
Vettura
1
N
Occupare
Passeggero
AUTOVERIFICA
Domande da 13 a 23 pag. 131-133
Problemi da 7 a 26 pag. 133-134
7 Esempi di modellazione di dati
PROGETTO 1
Si devono raccogliere e organizzare le informazioni relative ai risultati nelle gare
sportive di un campionato internazionale che si svolge in diverse località del mondo in date diverse nell’anno (per esempio la Coppa del mondo di sci o il motomondiale). In ogni gara i concorrenti possono guadagnare punti che, alla fine del
campionato, determineranno il vincitore.
Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate,
disegnare il modello E/R e verificare lo schema con le regole di lettura. Riconoscere
la chiave di ogni entità (se esiste). Per ogni attributo identificare il formato.
ANALISI DEI DATI
Le entità che possono essere individuate nel problema sono:
• Concorrente, per rappresentare le informazioni riguardanti i concorrenti del campionato;
• Gara, per le diverse gare che costituiscono l’insieme delle prove del campionato;
• Risultato, per i risultati conseguiti dai concorrenti nelle diverse prove.
122
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Gli attributi di Concorrente sono: codice concorrente, cognome, nome, nazionalità; tutti gli
attributi sono di tipo carattere.
Gli attributi di Gara sono: codice gara, descrizione, località, data di svolgimento; codice di
gara è di tipo carattere, la data è di tipo data/ora, i due attributi rimanenti sono di tipo
carattere.
Gli attributi di Risultato sono: codice, punti, posizione in classifica per una specifica gara;
tutti gli attributi sono di tipo numerico.
Tra l’entità Concorrente e l’entità Risultato esiste un’associazione uno a molti, perché un
concorrente può conseguire molti risultati e ciascun risultato si riferisce a un solo concorrente.
Tra l’entità Gara e l’entità Risultato si può stabilire un’associazione uno a molti, perché ci
possono essere tanti risultati per la stessa gara riferiti ai diversi concorrenti, ma un risultato
riguarda una specifica gara del campionato.
Si può osservare che il modello concettuale potrebbe essere rappresentato con due sole
entità, Concorrente e Gara, e un’unica associazione Partecipare di tipo molti a molti: infatti
ogni concorrente partecipa a più gare e ogni gara viene disputata da più concorrenti. In tale
caso gli attributi di Partecipare sarebbero i punti ottenuti e la posizione in classifica per una
specifica gara. Le due soluzioni sono sostanzialmente equivalenti.
Optiamo per la soluzione che prevede l’inserimento di una terza entità Risultato per
mostrare un esempio di associazione molti a molti che viene risolta con due associazioni
di tipo uno a molti, ottenendo una rappresentazione del modello concettuale complessivamente più semplice.
Le chiavi delle entità identificate sono: il codice del concorrente per l’entità Concorrente,
il codice di gara per l’entità Gara e il codice per l’entità Risultato.
Sulla base dell’analisi effettuata si può disegnare il modello entità/associazioni.
MODELLO E/R
Concorrente
1
N
Ottenere
Codice
{PK}
Cognome
Nome
Nazionalità
Risultato
CodRis
{PK}
Punti
Posizione
N
1
Determinare
Gara
CodGara {PK}
Descrizione
Località
Data
Nel modello E/R sono stati indicati i nomi delle associazioni con il verso di lettura e
l’opzionalità delle partecipazioni all’associazione. Nel modello proposto tutte le partecipazioni possono essere considerate come obbligatorie. Si tratta della diretta conseguenza del
fatto che un concorrente è colui che ha gareggiato almeno una volta e che le gare
considerate sono solo quelle effettuate; inoltre tutti i concorrenti di una gara ottengono un
risultato (compreso quello di ritirato).
Se invece si ritiene che sia da considerarsi concorrente anche chi non ha mai gareggiato,
la partecipazione dell’entità Concorrente all’associazione Ottenere è da considerarsi facoltativa (linea tratteggiata in uscita da Concorrente) come illustrato nello schema precedente. Analogamente, se si considerano anche le gare previste ma non effettuate, la partecipazione dell’entità Gara all’associazione Determinare è da ritenersi facoltativa (linea tratteggiata in uscita da Gara).
© Istituto Italiano Edizioni Atlas
123
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Il modello viene verificato utilizzando le regole di lettura presentate nel paragrafo precedente:
Ogni concorrente può ottenere uno o più risultati, ogni risultato deve essere ottenuto da
un solo concorrente. Ogni gara può determinare uno o più risultati, ogni risultato deve
essere determinato da una sola gara.
PROGETTO 2
Le informazioni sulle opere d’arte di molti artisti di epoche diverse, conservate nei
musei delle nazioni di tutto il mondo, devono essere catalogate e registrate in un
archivio. In una stessa città ci possono essere più musei. Le opere possono essere
di tipo diverso: tele, sculture, ecc. Uno stesso artista può avere opere in tanti
musei, così come in un museo, in genere, ci sono opere di artisti diversi. Per sapere
l’epoca di riferimento dell’artista si potrebbe registrare la data di nascita e la data
di morte (quest’ultima è nulla se l’artista è vivente). L’opera inserita nell’archivio
può assumere un’identificazione numerica, come una specie di numerazione del
catalogo delle opere.
Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate,
disegnare il modello E/R con il verso delle associazioni e verificare lo schema con
le regole di lettura. Riconoscere la chiave di ogni entità (se esiste). Per ogni attributo identificare il formato.
ANALISI DEI DATI
Le entità che possono essere individuate nel problema sono:
• Artista, per rappresentare le informazioni riguardanti gli autori delle opere da catalogare;
• Museo, per i diversi musei dove si trovano le opere catalogate;
• Città, per le informazioni sulle località che sono sedi dei musei;
• Opera, per le informazioni riguardanti le opere degli artisti.
Gli attributi di Artista sono: codice artista, cognome, nome, data nascita, data morte,
nazionalità; a eccezione delle date tutti gli attributi sono di tipo carattere.
Gli attributi di Museo sono: codice museo, denominazione; tutti di tipo carattere.
Gli attributi di Città sono: codice città, descrizione, nazione; tutti di tipo carattere.
Gli attributi di Opera sono: numero di catalogo, titolo, tipo (tela, scultura, ecc.), anno di
realizzazione; numero di catalogo e anno di realizzazione sono di tipo numerico, gli altri
attributi sono di tipo carattere.
Tra l’entità Artista e l’entità Opera esiste l’associazione uno a molti, perché ogni artista può
eseguire una o più opere e ciascuna opera è eseguita da un solo artista. Si considerano
anche artisti che non hanno opere esposte presso musei.
Tra l’entità Museo e l’entità Opera si può stabilire un’associazione uno a molti, perché ci
possono essere tante opere nello stesso museo, ma un’opera è collocata in un solo
museo (ci sono anche musei in fase di costituzione, senza opere esposte).
Tra l’entità Città e l’entità Museo esiste un’associazione uno a molti, perché una città può
ospitare uno o più musei, ma ogni museo deve risiedere in una sola città.
Le chiavi delle entità identificate sono: il codice artista per l’entità Artista, il codice museo
per l’entità Museo, il codice città per l’entità Città e il numero di catalogo per l’entità Opera.
124
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Sulla base dell’analisi effettuata si può disegnare il modello entità/associazioni:
1
Museo
N
Esporre
CodiceMuseo {PK}
Denominazione
N
Opera
NumeroCatalogo {PK}
Titolo
Tipo
Anno
N
Ospitare
Eseguire
1
1
Città
CodiceCittà
Descrizione
Nazione
Artista
{PK}
CodiceArtista {PK}
Cognome
Nome
Nascita
Morte
Nazionalità
Nel modello E/R sono stati indicati i nomi dei versi delle associazioni e l’opzionalità od
obbligatorietà delle partecipazioni alle associazioni (indicate rispettivamente con linea tratteggiata o continua).
Il modello viene verificato utilizzando le regole di lettura presentate nel paragrafo precedente:
Ogni città può ospitare uno o più musei, ogni museo deve essere ospitato in una sola città.
Ogni museo può esporre una o più opere, ogni opera deve essere esposta in un solo
museo.
Ogni artista può eseguire una o più opere, ogni opera deve essere eseguita da un solo
artista.
PROGETTO 3
Produrre il modello dei dati per la costruzione di un archivio anagrafico.
ANALISI DEI DATI
Esempi di archivi anagrafici sono:
• soci di un circolo culturale
• cittadini di un comune
• clienti di un’azienda
• fornitori di un’azienda
• agenti di vendita.
Per delimitare il campo di applicazione, si supponga di operare sull’archivio anagrafico dei
clienti di un’azienda.
© Istituto Italiano Edizioni Atlas
125
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Le principali informazioni, registrate per ogni cliente, sono:
• ragione sociale
• indirizzo
• CAP
• località
• provincia
• telefono
• partita IVA.
Queste sono necessarie per le intestazioni delle fatture, delle tratte e per la stampa di
elenchi e di indirizzari.
Per facilitare la gestione su un archivio anagrafico è opportuno associare a ogni cliente un
Codice che può essere un numero progressivo che viene assegnato a ogni nuovo cliente.
Informazioni aggiuntive utili per la gestione del cliente sono:
• il codice dell’agente che abitualmente tiene i contatti con il cliente
• il fido accordato al cliente.
Per la definizione dell’entità Cliente si possono indicare, quindi, i seguenti attributi: codice
cliente, ragione sociale, CAP, indirizzo, località, provincia, telefono, partita IVA, codice
agente, fido, con chiave codice cliente.
Al posto degli attributi CAP, località, provincia è opportuno inserire una nuova entità Località
descritta dai seguenti attributi: codice località, CAP, nome località, sigla della provincia.
Tale scelta permette di ottenere un’indicazione univoca per descrizioni diverse della medesima località: per esempio “Mte Nero”, “M.te Nero” e “M. Nero” si riducono all’unica
dizione “Monte Nero”.
In particolare va notato che ogni Cliente deve essere residente in una Località, vale a dire
che per ogni cliente non può mancare l’indicazione della località in cui risiede. Inoltre ogni
località può essere residenza di uno o più clienti, ma non necessariamente tutte le località
hanno al loro interno un cliente.
Le chiavi delle entità identificate sono: il codice cliente per l’entità Cliente e il codice località
per l’entità Località.
MODELLO E/R
Località
Codice
{PK}
CAP
Nome
SiglaProvincia
1
N
Risiedere
Cliente
CodiceCliente
RagioneSociale
Indirizzo
NumTelefono
PartitaIVA
CodiceAgente
Fido
{PK}
Il modello viene verificato utilizzando le regole di lettura:
Ogni località può essere residenza di uno o più clienti, ogni cliente deve risiedere in una
località.
126
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
PROGETTO 4
I pazienti di un reparto di chirurgia sono ricoverati in stanze singole con differenti
dotazioni (telefono, televisore, aria condizionata). I pazienti vengono operati da un
chirurgo. Si devono registrare anche data, ora e sala operatoria nella quale il paziente
viene operato. Bisogna inoltre tenere conto delle date di inizio e fine del ricovero.
Per semplicità si ipotizzi che un paziente possa essere ricoverato una sola volta nel
periodo di tempo considerato e che durante il ricovero non cambi la stanza.
Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate,
disegnare il modello E/R con il verso delle associazioni e verificare lo schema con
le regole di lettura. Riconoscere la chiave di ogni entità (se esiste). Per ogni attributo identificare il formato.
ANALISI DEI DATI
Le entità che possono essere individuate nel problema sono:
• Paziente, per rappresentare le informazioni riguardanti i pazienti;
• Chirurgo, per i chirurghi del reparto;
• Stanza, per le stanze che accolgono i pazienti.
Gli attributi di Paziente sono: codice, cognome, nome, indirizzo, numero di telefono; tutti
gli attributi sono di tipo carattere.
Gli attributi di Chirurgo sono: codice, cognome, nome e specialità; tutti di tipo carattere.
Gli attributi di Stanza sono: numero, e una serie di attributi per indicare la presenza o meno
di telefono, televisore, aria condizionata; numero è di tipo numerico, gli altri attributi sono
di tipo logico (vero, falso).
Le chiavi delle entità sono: il codice del paziente per l’entità Paziente, il codice del chirurgo
per l’entità Chirurgo e il numero di stanza per l’entità Stanza.
Tra l’entità Stanza e l’entità Paziente esiste l’associazione uno a molti, di nome Accogliere,
perché una stanza può accogliere uno o più pazienti e un paziente è accolto in una sola
stanza. Accogliere è un’associazione che ha come attributi le due date, di inizio e fine
ricovero, di tipo data.
Tra l’entità Chirurgo e l’entità Paziente si può stabilire un’associazione uno a molti, Operare, perché un chirurgo opera molti pazienti, mentre un paziente è operato da un solo
chirurgo. L’associazione Operare ha come attributi data e ora dell’intervento, oltre a un
identificatore della sala operatoria utilizzata.
Sulla base dell’analisi effettuata si può disegnare il modello entità/associazioni:
MODELLO E/R
Stanza
Numero
{PK}
Telefono
Televisore
AriaCond
1 Accogliere
InizioRicovero
FineRicovero
© Istituto Italiano Edizioni Atlas
N
Paziente
Codice
Cognome
Nome
Indirizzo
NumTelef
N
Operare
{PK}
DataIntervento
OraIntervento
SalaOperatoria
1
Chirurgo
Codice
Cognome
Nome
Specialità
{PK}
127
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
ERIA
EB
W
LIBR
Nel modello E/R sono stati indicati i nomi delle associazioni con il verso di lettura e
l’opzionalità delle partecipazioni. La partecipazione opzionale a un’associazione è indicata
con il tratteggio vicino all’entità che partecipa opzionalmente all’associazione. Nella costruzione del modello si è ipotizzato che un paziente possa essere dimesso senza subire alcun
intervento e che ci siano chirurghi che non effettuano interventi. Le ipotesi sono assolutamente ragionevoli in un caso reale.
Il modello viene verificato utilizzando le regole di lettura presentate nel paragrafo precedente:
Ogni stanza può accogliere uno o più pazienti, ogni paziente deve essere accolto in una
sola stanza.
Ogni chirurgo può operare uno o più pazienti, ogni paziente può essere operato da un solo
chirurgo.
2. Sviluppo di progetti informatici
MODELLO CON ASSOCIAZIONE RICORSIVA
PROGETTO 5
Consideriamo una catena di negozi distribuiti sul territorio nazionale. Ogni negozio ha un responsabile che coordina gli altri addetti al negozio. Il responsabile di
un negozio è unico ed è responsabile di un solo negozio. Si limitano le considerazioni ai soli dipendenti della catena che lavorano nei negozi.
Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate,
disegnare il modello E/R con il verso di lettura delle associazioni e verificare lo
schema con le regole di lettura. Riconoscere la chiave di ogni entità (se esiste). Per
ogni attributo identificare il formato.
ANALISI DEI DATI
Le entità che possono essere individuate nel problema sono due:
• Addetto, per rappresentare le informazioni sui dipendenti che lavorano nei negozi;
• Negozio, per i negozi della catena.
Gli attributi di Addetto sono: matricola, cognome, nome, indirizzo, numero di telefono;
matricola è di tipo numerico, tutti gli altri attributi sono di tipo carattere.
Gli attributi di Negozio sono: codice, indirizzo, telefono; tutti di tipo carattere.
Tra l’entità Addetto e l’entità Negozio esistono due associazioni. La prima, di tipo uno a
uno, di nome Dirigere, riguarda un addetto visto nel ruolo di manager del negozio. L’associazione Dirigere è uno a uno in quanto ogni negozio ha un solo manager e viceversa un
manager è responsabile di un solo negozio. La seconda, che riguarda l’addetto generico,
ha nome FarFunzionare, ed è di tipo molti a uno, perché ci sono più addetti per negozio e
ogni addetto lavora in un solo negozio.
Esiste poi un’associazione ricorsiva, di nome Coordinare, tra Addetto e se stesso. È
un’associazione uno a molti tra un addetto nel ruolo di manager e addetto nel ruolo di
collaboratore: un manager coordina molti collaboratori, ogni collaboratore ha un solo manager.
128
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
Le chiavi delle entità identificate sono: la matricola per l’entità Addetto, il codice del
negozio per l’entità Negozio.
Sulla base dell’analisi effettuata si può disegnare il modello entità/associazioni:
MODELLO E/R
Coordinare
1 Manager
N
Collaboratore
1
Dirigere
1
Addetto
Matricola
Cognome
Nome
Indirizzo
Telefono
{PK}
Negozio
N FarFunzionare
1
Codice
Indirizzo
Telefono
{PK}
Nel modello E/R sono stati indicati i nomi delle associazioni con il verso di lettura e
l’opzionalità delle partecipazioni. La partecipazione opzionale a un’associazione è indicata
con il tratteggio vicino all’entità che partecipa opzionalmente all’associazione. La partecipazione di Addetto all’associazione Coordinare è opzionale in entrambi i ruoli perché ci sono
addetti (i collaboratori) che non coordinano nessuno e ci sono addetti (i manager) che non
sono coordinati da nessuno.
Il modello viene verificato utilizzando le regole di lettura presentate nel paragrafo precedente:
Ogni negozio deve essere diretto da un solo addetto, ogni addetto può dirigere un solo
negozio.
Ogni negozio deve essere fatto funzionare da uno o più addetti, ogni addetto deve far
funzionare un solo negozio.
Ogni addetto può coordinare uno o più addetti, ogni addetto può essere coordinato da un
solo addetto.
AUTOVERIFICA
Problemi da 27 a 36 pag. 134-135
© Istituto Italiano Edizioni Atlas
129
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
DOMANDE
ATTIVITÀ DI AUTOVERIFICA
Entità, attributi e associazioni
130
1
Completa le frasi seguenti utilizzando una tra le parole elencate alla fine della domanda
a) Il livello ........ rappresenta l’effettiva installazione degli archivi elettronici
b) Il livello ........ rappresenta la realtà dei dati e le relazioni tra essi attraverso uno schema
c) Il livello ....... rappresenta il modo attraverso il quale i dati sono organizzati negli archivi
elettronici.
opzionale, fisico, schematico, uno a uno, uno a molti, logico, molti a molti, obbligatorio, concettuale
2
La
a)
b)
c)
d)
3
Quale tra le seguenti frasi esprime meglio il significato di schema Entity/Relationship?
a) rappresentazione grafica del modello logico
b) rappresentazione grafica del modello concettuale
c) rappresentazione grafica del modello fisico
d) rappresentazione grafica del modello sequenziale
4
Quali sono gli elementi di un modello Entity/Relationship?
a) associazioni
b) entità, archivi, dati
c) attributi, archivi, grafici
d) entità, associazioni, attributi
5
Quali delle seguenti definizioni esprime meglio la definizione di associazione?
a) un legame che definisce una corrispondenza tra attributi della stessa entità
b) un legame che definisce una corrispondenza tra attributi di entità differenti
c) una correlazione tra domini di entità
d) un legame che stabilisce un’interazione tra entità
6
Si consideri l’associazione EssereGenitore definita sull’entità Persona. Quali delle seguenti
affermazioni sono vere?
a) EssereGenitore è un’associazione ricorsiva
b) Essere Genitore è un’associazione binaria
c) La partecipazione di persona è obbligatoria in entrambe le direzioni
d) Persona partecipa all’associazione nei due ruoli di Genitore e Figlio
7
Si consideri l’associazione EssereMadre definita sull’entità Persona nei due ruoli di Madre e
Figlio. Quale delle seguenti affermazioni è vera?
a) Essere Madre è un’associazione binaria tra Madre e Figlio
b) Essere Madre è un’associazione ricorsiva su Persona
c) La partecipazione di persona nel ruolo di Madre è obbligatoria
struttura di dati nel modello logico deve facilitare
la progettazione del modello concettuale
la scelta della chiave tra gli attributi di un’entità
le operazioni di manipolazione e di interrogazione
le operazioni di derivazione del modello fisico
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
8
9
capitolo 3
Modellazione dei dati
Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
a) L’entità è un oggetto che ha un significato solo quando viene considerato in
relazione ad altri oggetti
b) Un’istanza è uno specifico esemplare di una entità
c) L’associazione è un legame che stabilisce un’interazione tra gli attributi di un’entità
d) Gli attributi possono essere proprietà delle entità o delle associazioni
V F
V F
V F
V F
Quali dei seguenti termini esprimono le caratteristiche di un attributo?
a) istanza
b) formato
c) dimensione
d) grado
e) opzionalità
ATTIVITÀ DI AUTOVERIFICA
10 Quali dei seguenti attributi possono svolgere la funzione di chiave primaria dell’entità?
a)
b)
c)
d)
e)
data di svolgimento della prova di uno studente
numero di registrazione di una fattura
codice dell’abbonato a una rivista
città di residenza di una persona
cognome di una persona
11 Quale delle seguenti definizioni esprime meglio la definizione di chiave primaria?
a)
b)
c)
d)
un attributo o un insieme di attributi che permettono di distinguere tra le istanze di un’entità
uno solo tra gli attributi di un’entità
il primo attributo riprodotto nello schema E/R
un attributo qualsiasi scelto dal progettista
12 Associa a ciascun termine della colonna di sinistra la definizione corretta tra quelle elencate
a destra:
a) attributi derivati
b) chiave primaria
c) dominio dell’attributo
d) valore nullo
1) informazione mancante, inapplicabile o sconosciuta
2) un attributo che consente di distinguere un’istanza
dall’altra per la stessa entità
3) gli attributi che si ottengono con le elaborazioni
4) insieme dei possibili valori assunti da un attributo
Tipi di associazioni
13 Quali dei seguenti elementi caratterizzano un’associazione?
a)
b)
c)
d)
e)
il dominio
il formato
il nome
il verso di lettura
la molteplicità
14 Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
a)
b)
c)
d)
e)
Le
Le
Le
Le
Le
associazioni
associazioni
associazioni
associazioni
associazioni
molti a molti sono scomponibili in due associazioni uno a uno
molti a molti non sono mai scomponibili
molti a molti sono scomponibili in due associazioni uno a molti
uno a uno sono raggruppabili in associazioni uno a molti
uno a molti sono scomponibili in più associazioni uno a uno
© Istituto Italiano Edizioni Atlas
V F
V F
V F
V F
V F
131
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
15 Per stabilire la natura dell’associazione tra le entità E1 ed E2, si rappresentano E1 ed E2 come
insiemi e si collegano con archi. I collegamenti uscenti da E1 sono 0..1 e quelli uscenti da
E2 sono 1..N. Quale delle seguenti affermazioni è vera?
a) Si tratta di un’associazione 1:1 tra E1 ed E2
b) Si tratta di un’associazione 1:N tra E1 ed E2
c) Si tratta di un’associazione N:1 tra E1 ed E2
d) Si tratta di un’associazione N:N tra E1 ed E2
16 Per stabilire la natura dell’associazione tra le entità E1 ed E2, si rappresentano E1 ed E2 come
insiemi e si collegano con archi. I collegamenti uscenti da E1 sono 0..N e quelli uscenti da
E2 sono 2..N. Quali delle seguenti affermazioni sono vere?
a) La partecipazione di E1 all’associazione è obbligatoria
b) La partecipazione di E1 all’associazione è facoltativa
c) La partecipazione di E2 all’associazione è obbligatoria
d) La partecipazione di E2 all’associazione è facoltativa
ATTIVITÀ DI AUTOVERIFICA
17 Per stabilire la natura dell’associazione tra le entità E1 ed E2, si rappresentano E1 ed E2 come
insiemi e si collegano con archi. I collegamenti uscenti da E1 sono 1..1 e quelli uscenti da
E2 sono 0..1. Quale delle seguenti affermazioni è vera?
a) Si tratta di un’associazione 1:1 tra E1 ed E2
b) Si tratta di un’associazione 1: N tra E1 ed E2
c) Si tratta di un’associazione N:1 tra E1 ed E2
d) Si tratta di un’associazione N:N tra E1 ed E2
18 Per stabilire la natura dell’associazione tra le entità E1 ed E2, si rappresentano E1 ed E2 come
insiemi e si collegano con archi. I collegamenti uscenti da E1 sono 1..N e quelli uscenti da
E2 sono 0..1. Quali delle seguenti affermazioni sono vere?
a) Si tratta di un’associazione 1:1 tra E1 ed E2
b) Si tratta di un’associazione 1: N tra E1 ed E2
c) La partecipazione di E1 all’associazione è obbligatoria
d) La partecipazione di E1 all’associazione è facoltativa
19 In quale tipo di associazione ogni istanza della prima entità si può associare a una o più
istanze della seconda entità e viceversa?
a) uno a uno
b) uno a molti
c) molti a molti
20 In quale tipo di associazione ogni istanza della prima entità si può associare a una o più
istanze della seconda entità, mentre ogni istanza della seconda entità si deve associare a una
sola istanza della prima?
a) uno a uno
b) uno a molti
c) molti a molti
21 Tra E1 ed E2 esiste un’associazione di nome Leggere, di tipo uno a molti, con partecipazione
obbligatoria per E1, facoltativa per E2. Come si può verificare l’associazione applicando le
regole di lettura? (scegliere le due risposte corrette)
a) Ogni E1 può leggere uno o più E2
b) Ogni E1 deve leggere uno e un solo E2
c) Ogni E1 deve leggere uno o più E2
d) Ogni E2 può essere letto da uno e un solo E1
132
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
22 Tra E1 ed E2 esiste un’associazione di nome Leggere, di tipo uno a uno, con partecipazione
facoltativa per E1, obbligatoria per E2. Come si può verificare l’associazione applicando le
regole di lettura? (scegliere le due risposte corrette)
a) Ogni E1 può leggere uno o più E2
b) Ogni E1 può leggere uno e un solo E2
c) Ogni E1 deve leggere uno e un solo E2
d) Ogni E2 deve essere letto da uno e un solo E1
23 Tra E1 ed E2 esiste un’associazione di nome Leggere, di tipo molti a molti, con partecipa-
ATTIVITÀ DI AUTOVERIFICA
zione facoltativa per E1, facoltativa per E2. Come si può verificare l’associazione applicando
le regole di lettura? (scegliere le due risposte corrette)
a) Ogni E1 può leggere uno o più E2
b) Ogni E1 deve leggere uno e un solo E2
c) Ogni E1 deve leggere uno o più E2
d) Ogni E2 può essere letto da uno o più E1
PROBLEMI
Entità, attributi e associazioni
Determinare gli attributi delle seguenti entità e stabilire quale tra essi può svolgere la
funzione di chiave primaria:
1
Veicolo immatricolato.
2
Cittadino contribuente per il sistema fiscale.
3
Movimento di magazzino per il carico o lo scarico di merce.
4
Figura geometrica piana.
5
Film.
6
Prodotto venduto in un centro commerciale.
Tipi di associazioni
Rappresentare con uno schema E/R le seguenti frasi, indicando la molteplicità delle associazioni individuate e l’obbligatorietà od opzionalità delle partecipazioni alle associazioni:
7
Una materia può essere insegnata da più docenti, un docente deve insegnare una sola
materia.
8
Un Comune appartiene a una sola Regione, ogni Regione può comprendere più Comuni.
9
Un attore può fare molti film, ogni film ha come interpreti molti attori.
10 Un reparto vende più prodotti, ogni prodotto è venduto in un solo reparto.
11 Uno studente può fare molte assenze, ogni assenza registrata fa riferimento a un solo
studente.
12 Ai clienti di un bar piacciono molti tipi di birra, un tipo di birra viene scelto da molti clienti.
13 Un elettore può votare per un solo partito, ogni partito può essere scelto da più elettori.
© Istituto Italiano Edizioni Atlas
133
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
14 Una spedizione evade uno o più ordini, un ordine viene evaso con una sola spedizione.
15 Un ordine è abbinato a una fattura, una fattura è relativa a un solo ordine.
16 Una spedizione causa l’emissione di una o più fatture, una fattura è inviata per effetto di una
e una sola spedizione.
17 Una classe è composta da almeno 15 studenti, uno studente partecipa alle attività di una sola
classe.
18 Un passeggero (in un viaggio aereo qualsiasi) viaggia su uno o più voli, un volo può essere
scelto dai passeggeri.
19 Uno studente deve essere iscritto a una sola facoltà, una facoltà può essere scelta da uno o
più studenti.
20 Uno studente universitario deve scegliere 4 o più corsi, un corso può essere scelto da uno o
ATTIVITÀ DI AUTOVERIFICA
più studenti.
21 Un corso universitario è tenuto da un solo docente, un docente può insegnare in uno o più corsi.
Dopo aver rappresentato lo schema E/R con le entità e le associazioni, indicando anche
l’obbligatorietà od opzionalità della partecipazione all’associazione, verificare il modello
con le regole di lettura:
22 Uno studente viene esaminato in relazione ai contenuti dei corsi che ha frequentato. Le
regole per la registrazione degli esami prevedono che venga tenuta traccia del voto e della
data dell’esame. Inoltre vengono registrati sia i voti positivi che quelli negativi. (Suggerimento: usare un’associazione con attributi).
23 In una scuola superiore ogni materia viene insegnata da molti docenti e ogni docente può
insegnare una o più materie. In una data classe una materia è insegnata da un solo docente.
(Suggerimento: usare un’associazione con attributi).
24 Un articolo di una catena di supermercati si trova in uno o più magazzini, un magazzino
contiene uno o più articoli. (Suggerimento: usare un’associazione con attributi).
25 Un articolo di una catena di supermercati è fornito da un solo fornitore, un fornitore fornisce
uno o più articoli.
26 Ogni formazione di una squadra di calcio è composta da 11 giocatori e 5 riserve, i giocatori
entrano a far parte di diverse formazioni, nel corso del campionato. (Suggerimento: usare
un’associazione con attributi).
Analisi dei dati di un problema
Individuare le entità, gli attributi e le associazioni, motivando le scelte effettuate, disegnare
il modello E/R con i versi delle associazioni e verificare lo schema con le regole di lettura.
Utilizzare come riferimento lo svolgimento dei problemi proposto nel Paragrafo 7.
27 Si deve realizzare la gestione automatizzata delle prestazioni specialistiche del Servizio Sanitario, per consentire le prenotazioni agli sportelli, con controllo della disponibilità e registrazione della prenotazione. I dati da organizzare riguardano i medici che operano presso
il Servizio Sanitario, i diversi tipi di visite specialistiche, le informazioni anagrafiche dei
pazienti che richiedono le visite, le prenotazioni delle visite da parte dei pazienti.
134
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
28 Si vuole automatizzare la gestione del magazzino di una ditta di ricambi. Oltre ai dati degli
articoli di magazzino, si devono organizzare nel modello di dati anche le informazioni
relative ai clienti dell’azienda e ai fornitori dei ricambi.
29 Si vogliono archiviare i dati relativi agli articoli pubblicati sulle riviste specializzate in un
determinato settore, organizzandoli per rivista, per argomento e per autore.
30 Si vuole gestire un magazzino di prodotti organizzato per reparti, tenendo sotto controllo
anche la situazione dei fornitori; in particolare si vuole poi rispondere alle seguenti esigenze:
• produrre listini di prodotti con descrizione, prezzi e sconti;
• produrre elenchi di prodotti con i relativi fornitori;
• controllare i prodotti sotto scorta.
31 Progettare un modello di dati per la gestione delle informazioni sugli spettacoli teatrali e
ATTIVITÀ DI AUTOVERIFICA
cinematografici che si svolgono nelle diverse città di una Regione, in modo da fornire alla
cittadinanza informazioni su:
• date nelle quali si svolgono gli spettacoli;
• prezzo dei biglietti;
• tipologia di spettacoli tra i quali scegliere;
• opportunità di scelta tra spettacoli diversi in una città;
• sale e indirizzo delle sedi degli spettacoli.
32 Costruire il modello di dati per la gestione delle informazioni riguardanti gli immobili e i loro
proprietari; un immobile può essere intestato anche a più proprietari e naturalmente una
persona può possedere uno o più immobili. Gli immobili sono di diverse tipologie: abitazioni,
uffici, negozi.
La gestione deve poter ottenere:
• le informazioni anagrafiche dei proprietari di un determinato immobile;
• l’elenco degli immobili con i relativi proprietari di una via prefissata della città;
• le caratteristiche degli immobili di una certa tipologia con metratura, piano, numero locali.
Rappresentare con uno schema E/R le seguenti frasi, indicando la molteplicità delle associazioni individuate e l’obbligatorietà od opzionalità delle partecipazioni alle associazioni:
33 Nell’insieme delle persone: ogni persona ha genitori, i genitori hanno uno o più figli.
34 Nell’insieme delle persone: ogni persona ha una madre, le madri hanno uno o più figli.
35 Nell’insieme dei pezzi che compongono un certo prodotto: ogni pezzo è composto da parti,
ogni parte viene utilizzata per comporre pezzi.
36 Le ricette hanno ingredienti, ma spesso nelle ricette si fa riferimento a altre ricette: per
esempio per preparare la pasta con sugo di tonno alla Carloforte si utilizzano diversi ingredienti e si richiede a un certo punto di aggiungere il pesto alla genovese che deve essere
preparato sfruttando un’altra ricetta.
© Istituto Italiano Edizioni Atlas
135
parte prima
Progettazione della base di dati
capitolo 3
Modellazione dei dati
SCHEDA DI AUTOVALUTAZIONE
CONOSCENZE
Modellazione dei dati
Il modello E/R
L’entità
L’associazione
Gli attributi
Le associazioni tra entità
Regole di lettura
Associazione ricorsiva
ABILITÀ
Individuare le entità, gli attributi della realtà osservata
Classificare le associazioni tra entità
Disegnare il modello E/R di un problema
Verificare la correttezza del modello attraverso le regole di lettura
Sviluppare i passi dell’analisi di un problema
Individuare problemi nei quali si usano associazioni ricorsive
Rappresentare nel modello E/R le associazioni ricorsive
DOMANDE PER LA PREPARAZIONE ALLA PROVA ORALE p. 531-532
SOLUZIONI AI QUESITI DI AUTOVERIFICA p. 536
136
© Istituto Italiano Edizioni Atlas
4
parte prima
Progettazione della base di dati
Modello relazionale
OBIETTIVI DI APPRENDIMENTO
In questo capitolo conoscerai i concetti base del modello
relazionale e imparerai le regole di derivazione del
modello logico a partire dal modello entità/associazioni.
Sarai in grado di applicare le operazioni relazionali per
interrogare una base di dati. Imparerai anche
l’importanza della normalizzazione e del controllo
sull’integrità dei dati.
© Istituto Italiano Edizioni Atlas
I concetti fondamentali del
modello relazionale
La derivazione delle relazioni
dal modello E/R
Le operazioni relazionali
Interrogazioni con più
operatori
La normalizzazione delle
relazioni
L’integrità referenziale
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
1 I concetti fondamentali del modello relazionale
Lo sviluppo di una base di dati di un sistema informativo passa, come abbiamo visto nel
precedente capitolo, attraverso diverse fasi progettuali, o livelli: livello concettuale, livello logico
e livello fisico.
Questo capitolo si occupa del livello logico e, specificatamente, del modello relazionale dei
dati. In questo modello una base di dati è vista come un insieme di tabelle sulle quali possono
essere eseguite opportune operazioni.
Il modello relazionale si chiama così perché è fondato sul concetto matematico di relazione
tra insiemi di oggetti. Per comprendere il concetto di relazione e vedere come questo porti
naturalmente alla rappresentazione di relazioni mediante tabelle, esaminiamo un semplice
esempio.
Consideriamo i due insiemi A1 = {4, 9, 16} e A2 = {2,3}. Si dice prodotto cartesiano di A1 e A2,
e si indica con A1×A2, l’insieme delle coppie (x,y) dove x appartiene ad A1 e y appartiene ad
A2. Ne segue che:
A1 = { 4, 9, 16 }
A2 = { 2, 3 }
A1xA2 = { (x,y) | x ∈ A1, y ∈ A2 } = { (4,2), (4,3), (9,2), (9,3), (16,2), (16,3) }
Alcune delle coppie che compongono il prodotto cartesiano sembrano essere più significative
di altre; in particolare il sottoinsieme Q, composto dalle coppie di valori (x, y) dove x è il
quadrato di y:
Q = { (4,2), (9,3) } ⊆ A1xA2
rappresenta la relazione tra coppie (x, y) che può essere descritta con la frase: “x è il quadrato
di y”. Si può quindi definire una relazione sui due insiemi A1 e A2 come un sottoinsieme del
prodotto cartesiano.
A1 x A2
(4,3)
(9,2)
(16,2)
(4,2)
(9,3)
Q
(16,3)
Sia A1xA2 che la relazione Q, che ora indicheremo con QuadratoDi, possono essere rappresentati con tabelle. Ogni tabella è composta da tante righe quante sono gli elementi del
prodotto cartesiano oppure di QuadratoDi e da due colonne, per rappresentare, ordinatamente, il valore del primo e del secondo elemento delle coppie (x,y). Per evitare ambiguità si può
porre in testa a ogni colonna il nome dell’insieme considerato.
A1×A2
A1
4
4
9
9
16
16
138
QuadratoDi
A2
2
3
2
3
2
3
A1
4
9
A2
2
3
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Riferendoci ora al mondo dell’automobile, consideriamo gli insiemi Modello e Costruttore, così
definiti:
Modello = { Panda, Idea, C2, C3 }, Costruttore ={ Citroen, Fiat }
Il prodotto cartesiano, Modello×Costruttore è formato dalle 8 coppie ottenute componendo un
elemento di Modello con un elemento di Costruttore in tutti i modi possibili:
{ (Panda, Citroen), (Idea, Citroen), (C2, Citroen), (C3, Citroen), (Panda, Fiat), (Idea, Fiat),
(C2, Fiat), (C3, Fiat) }
Consideriamo ora il sottoinsieme di Modello×Costruttore formato dai quattro elementi:
{ (C2, Citroen), (C3, Citroen), (Panda, Fiat), (Idea, Fiat) }
che indichiamo, in modo significativo, con il nome ProdottoDa.
Il prodotto cartesiano ModelloxCostruttore e la relazione ProdottoDa possono essere rappresentate con le seguenti tabelle.
Modello x Costruttore
Modello
C1
C1
C3
Panda
Panda
Cinquecento
Cinquecento
Costruttore
Citroen
Fiat
Citroen
Fiat
Citroen
Fiat
Citroen
ProdottoDa
Modello
C1
C3
Panda
Cinquecento
Costruttore
Citroen
Citroen
Fiat
Fiat
Più in generale:
Una relazione su n insiemi A1, A2, ..., An è un sottoinsieme dell’insieme di tutte le n-uple
a1, a2, ..., an che si possono costruire prendendo nell’ordine un elemento a1 dal primo
insieme A1, a2 dal secondo insieme A2, e così via. Una relazione con n-colonne si indica
come una relazione di grado n, il nome con il quale si identifica una colonna si chiama
attributo, l’insieme dei valori che possono essere assunti da un attributo definisce il
dominio di quell’attributo, e il numero delle n-uple che compongono la tabella (indicate
anche con il termine tuple) si chiama cardinalità della relazione.
La relazione ProdottoDa è una relazione di grado 2 e cardinalità 4. La coppia (Panda, Fiat) è una
delle 4 tuple della relazione. La relazione ha due attributi Modello e Costruttore che assumono
valori nei due domini, formati, rispettivamente, dall’insieme dei modelli di automobili prodotte
e dall’insieme dei costruttori di automobili.
Esaminiamo ora una relazione più complessa, la relazione Automobili. La relazione è rappresentata con una tabella, avente tante colonne quanti sono i domini (grado della relazione) e
tante righe quante sono le n-uple (cardinalità della relazione). I nomi dei domini sono i nomi
delle colonne, i valori che compaiono in una colonna sono omogenei tra loro, cioè appartengono a uno stesso dominio. La relazione è quindi una collezione di n-uple, ciascuna delle quali
contiene i valori di un numero prefissato di colonne.
© Istituto Italiano Edizioni Atlas
139
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Automobili
Modello
Serie 3
Panda
Giulietta
Bravo
Punto
C1
C3
Delta
Costruttore
BMW
Fiat
Alfa Romeo
Fiat
Fiat
Citroen
Citroen
Lancia
Segmento
Porte
D
Dominio4
di Segmento
B
5
C
5
C
5
B
3
B
3
C
5
C
5
Posti
5
5
5
5
5
4
5
5
Cardinalità
Grado
La relazione rappresenta un’entità, ogni n-upla rappresenta un’istanza dell’entità, le colonne
contengono i valori assunti dagli attributi dell’entità.
La chiave della relazione è un attributo o una combinazione minimale di attributi che
identificano univocamente le n-uple all’interno della relazione, cioè ogni riga della tabella
possiede valori diversi per l’attributo (o gli attributi) chiave.
La chiave di Automobili è rappresentata dall’attributo Modello.
Seguendo una notazione ormai consolidata, si rappresenta una tabella mediante il suo schema,
secondo una scrittura del tipo:
Automobili (Modello, Costruttore, Segmento, Porte, Posti)
indicando tra parentesi, dopo il nome della relazione, i nomi degli attributi separati dalla virgola
e sottolineando l’attributo chiave.
Si noti la somiglianza con la struttura di un file, formato da record, corrispondenti alle righe della
tabella; a sua volta il record è formato dai campi che sono gli attributi della relazione.
Per questo motivo, nella terminologia corrente dei database relazionali, si usano spesso anche
i termini record e campo al posto di tupla e attributo. Il termine tabella viene inoltre usato
come sinonimo di relazione.
Il modello relazionale di un database è un insieme di tabelle sulle quali si possono effettuare
operazioni, e tra le quali possono essere stabilite associazioni, come vedremo nel seguito.
Le tabelle seguenti mostrano le relazioni del database definito dallo schema:
Reparti (CodReparto, NomeReparto)
Prodotti (CodProdotto, Descrizione, Prezzo, CodReparto)
Vendite (Numero, Data, Quantità, CodProdotto)
Prodotti
Reparti
140
CodReparto
NomeReparto
CodProdotto Descrizione
Prezzo
CodReparto
AlimFr
Alimentari Freschi
Anan
Ananas sciroppato
1,13
AlimSca
AlimSca
Alimentari Scatola
Can1
Mangime misto
0,55
Can
AlimSur
Alimenti Surgelati
Cing
Bocconcini di cinghiale 5,00
Can
Cibo per cani
Fag
Fagioli borlotti
0,60
AlimSca
Gat
Cibo per gatti
FarBia
Farina 00
0,90
AlimSca
AlimSur
FarGia
Farina bramata
0,99
AlimSca
Gatto1
Patè di salmone
0,65
Gat
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Vendite
Numero
Data
Quantità
CodProdotto
1
05/09/2011
2
Anan
2
05/09/2011
1
Cing
3
05/09/2011
2
FarGia
4
06/09/2011
1
Gatto1
5
12/09/2011
1
Fag
6
12/09/2011
2
Can1
7
12/09/2011
2
Anan
8
12/09/2011
5
FarBia
9
12/09/2011
1
Can1
I requisiti fondamentali che caratterizzano il modello relazionale sono:
a. tutte le righe della tabella contengono lo stesso numero di colonne, corrispondenti agli
attributi.
b. gli attributi rappresentano informazioni elementari (o atomiche), non scomponibili
ulteriormente, cioè non ci sono campi di gruppo che contengono per ogni riga un
insieme di valori anziché un solo valore.
c. i valori assunti da un campo appartengono al dominio dei valori possibili per quel campo,
e quindi sono valori omogenei tra loro, cioè sono dello stesso tipo;
d. in una relazione, ogni riga è diversa da tutte le altre, cioè non ci possono essere due
righe con gli stessi valori dei campi: questo significa che esiste un attributo o una
combinazione di più attributi che identificano univocamente la n-upla, e che assumono
perciò la funzione di chiave primaria della relazione.
e. le n-uple compaiono nella tabella secondo un ordine non prefissato, cioè non è
rilevante il criterio con il quale le righe sono sistemate nella tabella.
La chiave (formata da uno o più attributi) identifica la n-upla all’interno della tabella: ogni dato
elementare contenuto nel modello relazionale deve essere accessibile attraverso la combinazione di: nome della tabella, nome e valore della chiave, nome della colonna contenente il dato.
Per questo motivo il modello relazionale fissa una regola di integrità sui dati, detta integrità
sull’entità (entity integrity), secondo la quale la chiave primaria non può avere valore nullo.
2 La derivazione delle relazioni dal modello E//R
Dal modello concettuale dei dati è possibile ottenere il modello logico dei dati: in altre parole
si può definire la struttura degli archivi adatti per organizzare i dati. Nel caso del modello relazionale le tabelle, che costituiscono il modello logico dei dati vengono ricavate dal modello E/R
mediante alcune semplici regole di derivazione:
1. ogni entità diventa una relazione;
2. ogni attributo di un’entità diventa un attributo della relazione, cioè il nome di una colonna
della tabella;
3. ogni attributo della relazione eredita le caratteristiche dell’attributo dell’entità da cui
deriva;
4. l’identificatore univoco di un’entità diventa la chiave primaria della relazione derivata;
5. l’associazione uno a uno diventa un’unica relazione che contiene gli attributi della prima
e della seconda entità;
© Istituto Italiano Edizioni Atlas
141
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
6. l’associazione uno a molti viene rappresentata aggiungendo, agli attributi dell’entità che
svolge il ruolo a molti, l’identificatore univoco dell’entità che svolge il ruolo a uno
nell’associazione. Questo identificatore, che prende il nome di chiave esterna (foreign
key) dell’entità associata, è costituito dall’insieme di attributi che compongono la chiave
dell’entità a uno dell’associazione. Gli eventuali attributi dell’associazione vengono inseriti nella relazione che rappresenta l’entità a molti, assieme alla chiave esterna.
7. l’associazione molti a molti diventa una nuova relazione (in aggiunta alle relazioni derivate dalle entità) composta dagli identificatori univoci delle due entità e dagli eventuali
attributi dell’associazione. La chiave della nuova relazione è formata dall’insieme di
attributi che compongo le chiavi delle due entità, oltre agli attributi dell’associazione
necessari a garantire l’unicità delle tuple nella relazione ottenuta.
Gli esempi seguenti mostrano come si possa passare dallo schema E/R alle corrispondenti
tabelle del modello logico. La struttura delle relazioni viene rappresentata mediante il corrispondente schema, facendo seguire al nome della tabella, tra parentesi tonde, l’elenco dei
campi corrispondenti agli attributi, separati da virgola. Gli attributi sottolineati indicano la chiave
della tabella. La chiave esterna viene evidenziata in corsivo.
Inoltre nel passaggio dall’entità alla relazione il nome sarà convertito al plurale, per rappresentare il fatto che la relazione contiene l’insieme delle n-uple che sono le istanze dell’entità.
• Associazioni 1:1
Si consideri l’associazione tra l’entità Cittadino e l’entità CodiceSSN: è un’associazione uno a
uno in quanto a ogni cittadino è assegnato uno e un solo codice del Servizio Sanitario
Nazionale. Lo schema E/R è il seguente:
Cittadino
1
1
EssereAssegnato
CodiceFiscale {PK}
Cognome
Nome
DataNascita
LuogoNascita
CodiceSSN
CodiceSanitario {PK}
NumeroAsl
CodRegione
da cui si deriva la relazione Anagrafe con gli attributi dell’una e dell’altra entità:
Anagrafe (CodiceFiscale, Cognome, Nome, DataNascita, LuogoNascita, CodiceSanitario,
NumeroASL, CodRegione)
Il campo CodiceFiscale è stato scelto come chiave primaria della relazione.
Relazione
Attributo
Anagrafe
CodiceFiscale
Cognome
Nome
DataNascita
LuogoNascita
CodiceSanitario
NumeroASL
CodRegione
Chiave
Formato
Dimensione
PK
carattere
carattere
carattere
data/ora
carattere
carattere
carattere
carattere
16
30
30
8
20
8
4
2
Si consideri però l’associazione tra Dipendente e Auto Aziendale nel caso di un’azienda dove,
come avviene nella maggior parte dei casi, solo a una piccola parte dei dipendenti è assegnata
un’auto aziendale.
142
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Si tratta, in pratica, di un’associazione 1:1 con partecipazione facoltativa di Dipendente.
Dipendente
1
1
EssereAssegnata
Matricola
{PK}
Cognome
Nome
DataNascita
LuogoNascita
AutoAziendale
Targa
Modello
Costruttore
Cilindrata
{PK}
Se, seguendo la regola generale in casi come questo, dal modello E/R si deriva una sola
relazione, si progetta una tabella con il seguente schema:
Dipendenti (Matricola, Cognome, Nome, DataNascita, LuogoNascita, Targa, Modello,
Costruttore, Cilindrata)
Si otterrà una tabella con molte righe con valori nulli nei campi Targa, Modello, Costruttore,
Cilindrata, in corrispondenza di tutti i dipendenti che non hanno un’auto aziendale assegnata.
In questi casi si preferisce modellare queste situazioni con due tabelle separate, in corrispondenza delle due entità Dipendente e AutoAziendale , e rappresentare l’associazione
EssereAssegnata aggiungendo agli attributi di AutoAziendale la chiave primaria della tabella
Dipendenti.
Dipendenti
(Matricola, Cognome, Nome, DataNascita, LuogoNascita)
AutoAziendali (Targa, Modello, Costruttore, Cilindrata, Matricola)
Si noti che, in pratica, l’associazione 1:1 è stata modellata come se si trattasse di un’associazione 1:N, con l’entità Dipendente vista come entità a uno nell’associazione. Si veda al riguardo
la regola di derivazione 6 alla pagina precedente. Alla luce di questa osservazione la regola di
derivazione di 5 diventa:
L’associazione uno a uno del modello concettuale viene tradotta, salvo alcune opportune
eccezioni, in un’unica relazione che contiene gli attributi della prima e della seconda entità.
L’argomento è ripreso in dettaglio nel riquadro a fine paragrafo.
• Associazioni 1:N
Nel seguente schema E/R, l’associazione tra l’entità Contratto e l’entità Dipendente è di tipo
uno a molti, in quanto ogni contratto può essere applicato a uno o più dipendenti, e ogni
dipendente deve essere regolato da un solo contratto di lavoro.
Contratto
Codice
{PK}
Descrizione
StipendioBase
DataScadenza
1
N
Applicare
Dipendente
Matricola
Cognome
Nome
Indirizzo
Qualifica
{PK}
Si costruiscono due relazioni Contratti e Dipendenti con gli attributi delle corrispondenti entità.
Viene aggiunta una chiave esterna alla tabella Dipendenti, costituita dalla chiave primaria di
Contratti.
Contratti (Codice, Descrizione, StipendioBase, DataScadenza)
Dipendenti (Matricola, Cognome, Nome, Indirizzo, Qualifica, CodiceContratto)
© Istituto Italiano Edizioni Atlas
143
parte prima
Progettazione della base di dati
Relazione
Attributo
Contratti
Dipendenti
capitolo 4
Modello relazionale
Chiave
Formato
Dimensione
Codice
Descrizione
StipendioBase
DataScadenza
PK
numerico
carattere
numerico
data/ora
3
30
10
8
Matricola
Cognome
Nome
Indirizzo
Qualifica
CodiceContratto
PK
carattere
carattere
carattere
carattere
carattere
numerico
7
30
25
30
10
3
FK
Agli attributi della relazione Dipendenti (a molti) è stata aggiunta come chiave esterna (FK,
Foreign Key) CodiceContratto, cioè la chiave primaria della relazione Contratti (a uno).
Esaminiamo ora il caso di un’associazione con attributi. Il diagramma E/R in figura rappresenta
l’associazione uno a molti di nome Acquistare che intercorre tra Persona e Automobile.
1
Persona
CodiceFiscale
Cognome
Nome
DataNascita
Indirizzo
Acquistare
N
{PK}
Automobile
Targa
{PK}
Modello
Produttore
Cilindrata
PrezzoListino
DataAcquisto
PrezzoAcquisto
Una persona può acquistare una o più automobili, mentre un’automobile deve essere acquistata da una sola persona. Applicando le regole di derivazione si ottengono le relazioni:
Persone
(CodiceFiscale, Cognome, Nome, DataNascita, Indirizzo)
Automobili (Targa, Modello, Produttore, Cilindrata, PrezzoListino, CodiceFiscale,
DataAcquisto, PrezzoAcquisto)
dove, agli attributi propri di Automobile, è stata aggiunta la chiave esterna CodiceFiscale e i due
attributi dell’associazione Acquistare.
In generale dal modello concettuale vengono derivate le relazioni che rappresentano le
entità e l’associazione uno a molti viene tradotta aggiungendo agli attributi dell’entità a
molti la chiave dell’entità a uno e gli attributi dell’associazione.
• Associazioni N:N
Si considerino le entità Docente e Classe nel contesto di un complesso scolastico formato da
classi di scuole elementari e medie inferiori: tra le due entità si può stabilire un’associazione
molti a molti, in quanto ogni docente può insegnare in una o più classi, e ogni classe deve avere
due o più docenti.
Docente
CodiceDocente {PK}
Cognome
Nome
Qualifica
Materia
144
N
Insegnare
NumeroOre
N
Classe
SiglaClasse
{PK}
NumeroAlunni
Aula
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Accanto alle tabelle Docenti e Classi viene creata una nuova relazione, chiamata Insegnare, il
cui record contiene gli attributi chiave delle due entità considerate. Poiché l’associazione è
caratterizzata dalla presenza di un attributo, la nuova tabella contiene, oltre alle chiavi delle due
entità correlate, anche l’attributo NumeroOre che indica le ore di insegnamento del docente
in una classe. NumeroOre non è attributo né di Docenti, né di Classi, ma dell’associazione:
esso diventa un campo di Insegnare.
Docenti
(CodiceDocente, Cognome, Nome, Qualifica, Materia)
Classi
(SiglaClasse, NumeroAlunni, Aula)
Insegnare (CodiceDocente, SiglaClasse, NumeroOre)
Bisogna porre molta attenzione nell’identificare la chiave primaria della nuova relazione: nel
caso in esame la coppia di attributi CodiceDocente, SiglaClasse è sufficiente per identificare
univocamente una riga di Insegnare, in quanto nella tabella un docente compare una sola volta
per una data classe. Ma non è sempre così, come si può osservare nel seguente esempio.
Consideriamo le entità Studente, Materia e l’associazione Valutare di tipo molti a molti. Il
diagramma E/R, riportato sotto, evidenzia gli attributi delle due entità e dell’associazione. Per
fissare le idee inquadriamo il problema nel contesto di una specifica classe e di un solo anno
scolastico.
Studente
Matricola
Cognome
Nome
Indirizzo
Telefono
N
Valutare
{PK}
Data
Voto
N
Materia
CodiceMateria {PK}
NomeMateria
NumeroOre
Applicando le regole di derivazione si ottengono le relazioni definite dai seguenti schemi:
Studenti
(Matricola, Cognome, Nome, Indirizzo, Telefono)
Materie
(CodiceMateria, NomeMateria, NumeroOre)
Valutazioni (Matricola, CodiceMateria, Data, Voto)
Resta da stabilire quale sia l’insieme minimo di attributi che permette di distinguere tra le
n-uple di Valutazioni. La coppia di attributi Matricola, CodiceMateria non risponde a questa
esigenza in quanto, nel corso dell’anno, uno studente viene valutato più di una volta nella
medesima materia. Nell’ipotesi che uno studente non possa essere valutato nella medesima
materia nello stesso giorno, la chiave primaria di Valutazioni è formata dall’insieme di tre
attributi: Matricola, CodiceMateria, Data.
In generale, nel caso dell’associazione molti a molti, vengono derivate le relazioni
corrispondenti alle entità e l’associazione viene tradotta con una terza relazione contenente le chiavi delle due entità e gli eventuali attributi dell’associazione.
ASSOCIAZIONI 1:1 CON PARTECIPAZIONE FACOLTATIVA E ASSOCIAZIONI RICORSIVE
Nello schema E/R nella figura seguente è descritta l’associazione uno a uno di nome
Coordinare che esiste tra i docenti e le classi di una scuola: ogni classe deve avere uno e
un solo coordinatore, un docente coordina una sola classe, ma vi sono docenti che non
sono coordinatori. Come si è osservato in precedenza, in casi come questo la scelta di
creare una sola relazione, composta da tutti gli attributi delle entità partecipanti all’associazione, appare inadeguata. In questo caso, infatti, comparirebbero molte righe con valori
nulli in corrispondenza degli attributi di Classe per i docenti che non sono coordinatori.
© Istituto Italiano Edizioni Atlas
145
parte prima
Progettazione della base di dati
Docente
capitolo 4
Modello relazionale
1
1
Coordinare
CodiceDocente {PK}
Cognome
Nome
Qualifica
Materia
Classe
SiglaClasse
{PK}
NumeroAlunni
Aula
Una soluzione migliore consiste nel trattare questa associazione come un’associazione
uno a molti. Si costruiscono due relazioni con gli attributi che caratterizzano le due entità,
e l’associazione viene modellata aggiungendo la chiave dell’entità con partecipazione
facoltativa all’associazione (Docente) in coda agli attributi dell’entità con partecipazione
obbligatoria (Classe).
Docenti (CodiceDocente, Cognome, Nome, Qualifica, Materia)
Classi (SiglaClasse, NumeroAlunni, Aula, Coordinatore)
Nel caso di partecipazione facoltativa di entrambe le entità, per esempio nel caso in cui
anche la partecipazione di Classe sia facoltativa, non ci sono indicazioni per la scelta
dell’entità che fornisce la chiave destinata a diventare chiave esterna. In questa situazione
è possibile aggiungere CodiceDocente in coda agli attributi di Classe o, viceversa, arricchire
gli attributi di Docente con la chiave di Classe.
Si osservi che questa regola è tanto più utile quanto meno frequenti sono le partecipazioni
all’associazione. Si pensi a casi limite quale, per esempio, quello delle due entità
CittadinoItaliano e Senatore. Poiché ogni cittadino italiano può essere senatore e un
senatore deve essere un cittadino italiano, tra le due entità sussiste un’associazione uno
a uno con partecipazione “molto facoltativa” di cittadino, in quanto i cittadini italiani sono
circa 60.000.000 mentre, secondo la Costituzione italiana, il numero dei senatori è fissato
in 315, oltre a un limitato numero di senatori a vita.
Si noti infine che mantenere due tabelle distinte per le due entità, anche quando esse sono
in associazione uno a uno, può essere una scelta importante. Se la fase di analisi del
problema reale ha portato ad individuare due entità distinte può significare che ogni entità
descrive realtà specifiche che è bene rimangano separate. Per esempio, gli attributi che
descrivono un senatore della Repubblica, quali: data dell’elezione, collegio nel quale è stato
eletto, gruppo parlamentare di appartenenza, sono molto specifici e ben distinti da quelli
che servono a descrivere un cittadino italiano.
Le associazioni ricorsive sono state presentate nel precedente capitolo. In figura è
mostrata un’associazione ricorsiva uno a molti tra i dipendenti di un’impresa: alcuni dipendenti sono anche supervisori e coordinano un certo numero di persone; i dipendenti
coordinati (collaboratori) dipendono da un solo supervisore, ma vi sono dipendenti che non
dipendono da alcun supervisore.
Coordinare
1 Supervisore
Dipendente
N
Collaboratore
146
Matricola
Cognome
Nome
DataNascita
Indirizzo
{PK}
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
L’associazione viene rappresentata come le normali associazioni uno a molti, aggiungendo
agli attributi dell’entità a molti la chiave della entità a uno. In questo caso, poiché compare
la medesima entità sia dalla parte a uno che dalla parte a molti dell’associazione, la chiave
di Dipendente apparirà sia come chiave primaria della relazione, sia come chiave esterna
per individuare il supervisore (se esiste) di un dipendente.
Se gli attributi di Dipendente sono: Matricola, Cognome, Nome, DataNascita, Indirizzo, si
ottiene lo schema:
Dipendenti (Matricola, Cognome, Nome, DataNascita, Indirizzo, Supervisore)
dove l’attributo Supervisore assume il valore della matricola del supervisore del dipendente descritto nella n-upla.
Volendo evitare la presenza di righe con valori nulli nel campo Supervisore di dipendente,
si può adottare una soluzione differente. L’entità Dipendente viene rappresentata con gli
attributi che le competono e l’associazione diventa una nuova relazione che abbina dipendenti e supervisori mediante le rispettive matricole:
Dipendenti
(Matricola, Cognome, Nome, DataNascita, Indirizzo)
Coordinamenti (Matricola, Supervisore)
Nella relazione Coordinamenti sono presenti le sole n-uple dei dipendenti che hanno un
supervisore e non si hanno attributi con valori nulli.
Considerazioni simili si possono fare anche per le associazioni uno a uno ricorsive.
AUTOVERIFICA
Domande da 1 a 13 pag. 177-179
Problemi da 1 a 5 pag. 182-183
3 Le operazioni relazionali
In generale gli operatori relazionali agiscono su una o più relazioni per ottenere una nuova
relazione. In sostanza le operazioni relazionali consentono di effettuare le interrogazioni
alla base di dati per ottenere le informazioni desiderate estraendo da una tabella una
sottotabella, oppure combinando tra loro due o più tabelle e generando così nuove relazioni.
Per illustrare le operazioni relazionali faremo riferimento al seguente esempio.
Si consideri il modello E/R, molto semplificato, con le entità Agente e Cliente, per rappresentare la distribuzione commerciale di un’azienda. Tra le due entità esiste un’associazione uno a
molti, perché ogni agente può contattare uno o più clienti, mentre ogni cliente deve essere
contattato da un solo agente.
La partecipazione di Cliente è obbligatoria mentre la partecipazione di Agente è facoltativa.
1
Agente
IDAgente
Nome
Zona
N
Contattare
{PK}
Cliente
IDCliente
{PK}
RagioneSociale
PartitaIVA
Provincia
La struttura delle tabelle derivate è descritta dal seguente schema:
Agenti (IDAgente, Nome, Zona)
Clienti (IDCliente, RagioneSociale, PartitaIVA, Provincia, IDAgente)
Il modello relazionale è quindi formato dalle due relazioni Agenti e Clienti; l’associazione uno
a molti viene rappresentata aggiungendo agli attributi della relazione Clienti il campo IDAgente
come chiave esterna.
© Istituto Italiano Edizioni Atlas
147
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Per distinguere tra il campo IDAgente di Agenti e il campo omonimo di Clienti si fa uso della
notazione con il punto (dot-notation), secondo la quale il nome di un attributo è completamente
specificato dal nome della tabella seguito da un punto e dal nome del campo:
NomeTabella.NomeAttributo
I due campi sono referenziati con Agenti.IDAgente e Clienti.IDAgente.
Questa notazione deve essere utilizzata obbligatoriamente solo in caso di omonimie per
evitare riferimenti ambigui agli attributi.
Il database composto dalle due relazioni Agenti e Clienti, con alcune righe di esempio, è
mostrato in figura.
Clienti
Agenti
IDCliente RagioneSociale
PartitaIVA
Lami
04357839912
Lamiere per Auto
Provincia IDAgente
IDAgente Nome
Zona
TO
Bia
Bia
Nord
Bianchi
Levi
Levigatoria Toscana
01528120155
FI
Ner
Bru
Bruni
Centro
Luci
Lucidatura Metalli
01572800164
RM
Ner
Ner
Neri
Centro
Meta
Metallurgica Emiliana
01583315265
BO
Ner
Ros
Rossi
Sud
Metb
Metalli Rari
01642877201
NA
Ros
Ver
Verdi
Isole
Otto
Ottonificio Pugliese
04687990657
BA
Ros
Prome
Prodotti Metallici
05332518672
BG
Gia
Rame
Rame & Metalli
03568168943
PA
Ver
Tond
Tondini metallici
05467833808
BS
Bia
Vite
Viteria Lombarda
05567389302
MI
Bia
Vitp
Viteria di Precisione
06443652006
MI
Bia
Le principali operazioni relazionali sono: la Selezione, la Proiezione e la Congiunzione. Selezione
e proiezione sono operazioni che agiscono su una sola tabella, mentre la congiunzione è un’operazione che agisce su due tabelle. La selezione è un’operazione che estrae da una tabella solo
alcune righe, mentre la proiezione è un’operazione che estrae solo alcune colonne di una tabella.
La figura mostra un esempio di selezione e un esempio di proiezione sulla tabella Agenti.
Agenti
IDAgente Nome
Zona
Bia
Bianchi Nord
Bru
Bruni
Centro
Ner
Neri
Centro
Ros
Rossi
Sud
Ver
Verdi
Isole
IDAgente Nome
Selezione
Zona
Bru
Bruni
Centro
Ner
Neri
Centro
Le righe di Agenti dove:
Zona = “Centro”
Proiezione
148
Nome
Zona
Bianchi
Nord
Bruni
Centro
Neri
Centro
Rossi
Sud
Verdi
Isole
Le colonne Nome
e Zona di Agenti
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
1. La selezione genera una nuova relazione costituita solo dalle n-uple della relazione di
partenza che soddisfano a una determinata condizione; vengono cioè selezionate le righe con
i valori degli attributi corrispondenti alla condizione prefissata.
• Grado: la relazione ottenuta possiede tutte le colonne della relazione di partenza, e quindi ha
lo stesso grado.
• Cardinalità: nella nuova relazione la cardinalità può essere minore o uguale alla tabella di
partenza, ma è ragionevole pensare che sia solitamente minore. La cardinalità è uguale
quando tutte le righe soddisfano alla condizione.
L’operazione di selezione viene indicata mediante il simbolo σ seguito dal nome della tabella
T sulla quale viene operata la selezione. La proprietà P, che caratterizza l’operazione di selezione sulle righe di T, viene scritta come indice di σ. La scrittura: σPT indica un’operazione su
T che estrae le sole righe per le quali la proprietà P è vera.
Per esempio, se si vuole l’elenco dei clienti della provincia di Milano, si effettua sulla relazione
Clienti una selezione per ricercare quelle righe che soddisfano la proprietà Provincia = “MI”,
selezionando dalla tabella tutte le righe che hanno valore “MI” per l’attributo Provincia. Si
ottiene una nuova tabella, che costituisce la relazione generata a partire da quella iniziale.
Nell’esempio in esame si ottiene la tabella:
IDCliente
RagioneSociale
PartitaIVA
Provincia
IDAgente
Vite
Viteria Lombarda
05567389302
MI
Bia
Vitp
Viteria di Precisione
06443652006
MI
Bia
Utilizzando un linguaggio di progetto (o di pseudocodifica), cioè con parole del linguaggio
naturale, l’operazione di selezione può essere descritta in questo modo:
σP Clienti
Selezione di Clienti per Provincia = “MI”
2. La proiezione genera una nuova relazione estraendo dalla tabella iniziale solo alcune colonne.
• Grado: nella relazione risultante il grado è minore o uguale al grado della relazione di
partenza. Il grado è uguale a quello di partenza nel caso di una proiezione effettuata allo
scopo di produrre una tabella con le colonne riordinate.
• Cardinalità: nella relazione risultante la cardinalità è minore o uguale a quella di partenza. La
cardinalità nella maggior parte dei casi è uguale a quella di partenza. È minore se, per effetto
della proiezione su un numero di colonne minore di quello originale, si ottiene una tabella con
righe uguali (per esempio se tra le colonne estratte non è compresa la colonna della chiave):
in questo caso le righe duplicate diventano una sola perché il modello relazionale richiede,
come è stato detto in precedenza, che le n-uple di una relazione siano tutte distinte. Questa
caratteristica è valida solo in teoria: la maggior parte dei DBMS commerciali, per ragioni di
efficienza, non effettua alcun controllo in merito all’unicità delle righe di una tabella, a meno
che questo non venga esplicitamente richiesto dall’utente con un apposito comando. Riprenderemo l’argomento nei prossimi capitoli.
L’operazione di proiezione viene indicata mediante il simbolo Π seguito dal nome della tabella
T sulla quale viene operata la proiezione. La lista L che elenca le colonne da estrarre da T, viene
riportata come indice di Π. La scrittura: ΠLT indica un’operazione su T che estrae le colonne
elencate in L.
Per esempio, se si vuole l’elenco dei codici dei clienti con la ragione sociale e il codice
dell’agente, occorre applicare alla relazione Clienti l’operazione di proiezione secondo la lista
degli attributi IDCliente, RagioneSociale e IDAgente.
© Istituto Italiano Edizioni Atlas
149
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
In pseudocodifica si scrive:
ΠL Clienti
Proiezione di Clienti su IDCliente, RagioneSociale, IDAgente
La proiezione dell’esempio produce la tabella in figura.
IDCliente
RagioneSociale
IDAgente
Lami
Lamiere per Auto
Bia
Levi
Levigatoria Toscana
Ner
Luci
Lucidatura Metalli
Ner
Meta
Metallurgica Emiliana
Ner
Metb
Metalli Rari
Ros
Otto
Ottonificio Pugliese
Ros
Prome
Prodotti Metallici
Gia
Rame
Rame & Metalli
Ver
Tond
Tondini metallici
Bia
Vite
Viteria Lombarda
Bia
Vitp
Viteria di Precisione
Bia
Nella figura sottostante è mostrata la tabella ∏ ottenuta con la proiezione ∏ IDAgente Clienti,
cioè per effetto della proiezione di Clienti sul solo attributo IDAgente. Si osservi, dal confronto
con la tabella T, che rappresenta l’intera colonna IDAgente di Clienti, che ∏ è formata da sole
quattro righe per effetto della riduzione a una delle righe duplicate di T, evidenziate in colore.
T
∏
IDAgente
IDAgente
Bia
Ner
Ner
Ner
Ros
Ros
Gia
Ver
Bia
Bia
Bia
Bia
Ner
Ros
Gia
Ver
3. La congiunzione (join) tra due tabelle R e S, di schema:
R(A1, A2, … Am)
S(B1, B2, … Bn)
combina due relazioni generando una nuova relazione le cui righe contengono tutti gli attributi
di R e quelli di S abbinando le sole righe di R e di S che soddisfano una data proprietà P. In
pratica, nella quasi totalità delle congiunzioni, la proprietà P consiste in una o più condizioni di
uguaglianza tra attributi di R e attributi di S, cioè P è una condizione del tipo: R.A1 = S.B1 and
R.A2 = S.B2. Questo tipo di congiunzioni sono indicate con il nome di equi-join.
La relazione risultante è caratterizzata da:
• Grado: se il grado (cioè il numero delle colonne) delle relazioni R ed S è m e, rispettivamente,
n, il grado della relazione generata è uguale a m+n.
150
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
• Cardinalità: nel caso di join generici la cardinalità della relazione risultante non è prevedibile
a priori e si può solo dire che il numero di righe della relazione risultante è minore o uguale
(in genere minore) al prodotto del numero di righe di R e quelle di S. Nel caso di equi-join che
coinvolgano una chiave esterna di B con la corrispondente chiave primaria della tabella
associata A, la cardinalità della congiunzione ha valore minore od uguale alla cardinalità di B.
In questo tipo di congiunzione, infatti, ogni riga di B (cioè della relazione che svolge il ruolo
a molti) è combinata con una sola riga di A (la relazione che svolge il ruolo a uno) e ci possono
essere righe di B con un valore per la chiave esterna che non trova corrispondenti nella chiave
primaria di A.
Per esempio, la congiunzione tra Clienti e Agenti per valori identici dei campi Clienti.IDAgente ed
Agente.IDAgente genera la tabella in figura.
IDCliente
Ragione Sociale
PartitaIVA
Lami
Lamiere per Auto
04357839912
Provincia
Clienti. Agenti.
IDAgente IDAgente
Nome
Zona
TO
Bia
Bia
Bianchi
Nord
Levi
Levigatoria Toscana
01528120155
FI
Ner
Ner
Neri
Centro
Luci
Lucidatura Metalli
01572800164
RM
Ner
Ner
Neri
Centro
Meta
Metallurgica Emiliana
01583315265
BO
Ner
Ner
Neri
Centro
Metb
Metalli Rari
01642877201
NA
Ros
Ros
Rossi
Sud
Otto
Ottonificio Pugliese
04687990657
BA
Ros
Ros
Rossi
Sud
Rame
Rame & Metalli
03568168943
PA
Ver
Ver
Verdi
Isole
Tond
Tondini metallici
05467833808
BS
Bia
Bia
Bianchi
Nord
Vite
Viteria Lombarda
05567389302
MI
Bia
Bia
Bianchi
Nord
Vitp
Viteria di Precisione
06443652006
MI
Bia
Bia
Bianchi
Nord
Nell’operare la congiunzione secondo le regole dell’equi-join, ogni riga di Clienti viene confrontata con le righe di Agenti e vengono selezionate le sole righe per le quali l’attributo IDAgente
di Clienti ha il medesimo valore dell’attributo IDAgente di Agenti:
Clienti.IDAgente = Agenti.IDAgente
Grazie alla congiunzione si riescono a correlare informazioni in tabelle differenti: dall’esempio
in figura si nota che, dopo avere congiunto le tabelle Clienti e Agenti, per ogni cliente è
possibile conoscere, oltre al codice dell’agente, anche il nome e la zona dove opera l’agente
a lui assegnato.
Si può controllare che la congiunzione tra Clienti e Agenti ha 10 righe, ovvero il numero di righe
di Clienti diminuito di 1. Questo succede perché nella tabella Clienti è presente la riga con
chiave ‘Prome’ che ha la chiave esterna di valore ‘Gia’ e non c’è alcun record di Agenti con
questo valore per la chiave primaria.
L’esempio mostra anche che l’equi-join produce una relazione con informazioni ridondanti, in
quanto la colonna (o le colonne) che sono confrontate per ricercare valori identici sono duplicate. Nel caso delle relazioni Agenti e Clienti si tratta della colonna IDAgente che compare due
volte. Si deve quindi realizzare una congiunzione che eviti questa ridondanza per gli attributi
comuni. Questo tipo di congiunzione prende il nome di join naturale. Nel join naturale sono
combinate le sole righe delle due tabelle con valori identici negli attributi comuni che sono
presenti una sola volta nelle righe della congiunzione.
Il join naturale tra R ed S è caratterizzato da:
• Grado: se il grado delle relazioni R ed S è m ed n e le due tabelle hanno k attributi comuni,
allora R join S ha grado uguale a m+n-k.
• Cardinalità: per la cardinalità di R join S valgono le considerazioni già svolte per l’equi-join.
© Istituto Italiano Edizioni Atlas
151
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Il join naturale viene indicato con il simbolo
posto tra le due relazioni R e S che sono combinate.
L’attributo A, comune alle due tabelle, è riportato come indice dei nomi delle tabelle.
Nel caso della relazione Clienti, per esempio, l’elenco dei clienti e dei relativi agenti si ottiene
applicando l’operazione di congiunzione tra la relazione Clienti e la relazione Agenti secondo
l’attributo comune IDAgente, selezionando quindi solo le righe per le quali vale la proprietà:
Agenti.IDAgente = Clienti.IDAgente
Questa operazione si rappresenta in pseudocodifica nel seguente modo:
RA
SA
Congiunzione di Clienti e Agenti su IDAgente
Il join naturale genera la tabella in figura. Per effetto della congiunzione si ottiene un’unica
tabella dove le righe di Clienti sono state completate con tutti gli attributi di Agenti. Si noti
anche che il campo IDAgente, presente in entrambe le tabelle, non è stato duplicato.
IDCliente
RagioneSociale
PartitaIVA
Provincia
IDAgente
Nome
Zona
Lami
Lamiere per Auto
04357839912
TO
Bia
Bianchi
Nord
Levi
Levigatoria Toscana
01528120155
FI
Ner
Neri
Centro
Luci
Lucidatura Metalli
01572800164
RM
Ner
Neri
Centro
Meta
Metallurgica Emiliana
01583315265
BO
Ner
Neri
Centro
Metb
Metalli Rari
01642877201
NA
Ros
Rossi
Sud
Otto
Ottonificio Pugliese
04687990657
BA
Ros
Rossi
Sud
Rame
Rame & Metalli
03568168943
PA
Ver
Verdi
Isole
Tond
Tondini metallici
05467833808
BS
Bia
Bianchi
Nord
Vite
Viteria Lombarda
05567389302
MI
Bia
Bianchi
Nord
Vitp
Viteria di Precisione
06443652006
MI
Bia
Bianchi
Nord
La congiunzione è realizzata facendo corrispondere valori uguali per attributi comuni nelle due
tabelle: per questo motivo il join naturale è anche un equi-join. L’equi-join è però un join di
caratteristiche più generali del join naturale e permette di congiungere tabelle confrontando
attributi che hanno nomi diversi, ma valore uguale, nelle due relazioni che vengono combinate.
Supponiamo, per esempio, che le relazioni Clienti e Agenti siano state definite per mezzo del
seguente schema:
Agenti (IDAgente, Nome, CodiceZona)
Clienti (IDCliente, RagioneSociale, PartitaIVA, Provincia, AgenteDiZona)
Questo schema differisce da quello adottato in precedenza solo per il nome della chiave
esterna che si chiama AgenteDiZona e non IDAgente. In questo caso le due tabelle non hanno,
almeno formalmente, attributi comuni perché non ci sono attributi con lo stesso nome nelle
due tabelle, ma, di fatto, IDAgente e AgenteDiZona sono attributi comuni.
Per trattare questa situazione adotteremo la seguente forma di pseudocodifica:
RA
SB
Congiunzione di Agenti su IDAgente e Clienti su AgenteDiZona
oppure
RPK
SFK
Congiunzione di Agente su CodiceID e Cliente su AgenteDiZona
per evidenziare la chiave primaria (PK) e la chiave esterna (FK) delle due tabelle.
152
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
4. Oltre alle operazioni di proiezione, selezione e congiunzione, sulle tabelle si possono eseguire
le operazioni insiemistiche di unione, intersezione e differenza che permettono di combinare
due relazioni R ed S, di identico schema, (attributi uguali in nome e numero), costruendo le
relazioni:
• R ∪ S: l’unione di R ed S è formata dalle righe presenti in R oppure in S;
• R ∩ S: l’intersezione di R ed S è formata dalle righe comuni ad R ed S;
• R – S : la differenza tra R ed S è formata dalle righe di R che non sono presenti in S.
JOIN ESTERNO
Il join esterno (outer join) è una congiunzione che restituisce le righe dell’una e dell’altra
tabella anche se non sono presenti valori uguali per gli attributi comuni; nel join naturale e
nell’equi-join, indicati come join interni, sono combinate, infatti, solo le righe per le quali,
per ogni attributo comune tra le tabelle, il valore dell’attributo nella prima tabella trova un
valore uguale nel corrispondente attributo nella seconda tabella. Per esempio, nel caso della
congiunzione Clienti join Agenti si osserva, per confronto con le tabelle Clienti e Agenti, che,
nella congiunzione, non compare il cliente di codice “Prome” e nemmeno l’agente di codice
“Bru”. Questo succede perché nel record del cliente l’attributo IDAgente vale “Gia” e non
c’è alcun record di Agenti con questo valore della chiave. L’agente di codice “Bru” non è
presente nella congiunzione perché non c’è alcun cliente al quale è stato assegnato quell’agente. Nel primo caso a un cliente è stato attribuito, presumibilmente per errore, un
codice agente non corretto; nel secondo caso c’è un agente senza clienti. I join esterni
permettono di includere anche queste righe nella congiunzione e, come si vedrà, di individuare eventuali situazioni anomale.
Il join esterno può essere left join quando elenca comunque tutte le righe della prima
tabella congiungendo, tra le righe della seconda, solo quelle per le quali si trovano valori
corrispondenti per gli attributi comuni. Nella congiunzione le righe senza corrispondenti nella
seconda tabella sono completate con valori nulli. Congiungendo con un left join le tabelle
Clienti e Agenti sul campo IDAgente si ottiene la tabella in figura.
Clienti Left Join Agenti
IDCliente
Ragione Sociale
PartitaIVA
Nome
Zona
Lami
Lamiere per Auto
04357839912
TO
Bia
Bia
Bianchi
Nord
Levi
Levigatoria Toscana
01528120155
FI
Ner
Ner
Neri
Centro
Luci
Lucidatura Metalli
01572800164
RM
Ner
Ner
Neri
Centro
Meta
Metallurgica Emiliana 01583315265
BO
Ner
Ner
Neri
Centro
Metb
Metalli Rari
01642877201
NA
Ros
Ros
Rossi
Sud
Otto
Ottonificio Pugliese
04687990657
BA
Ros
Ros
Rossi
Sud
Prome
Prodotti Metallici
05332518672
BG
Gia
Rame
Rame & Metalli
03568168943
PA
Ver
Tond
Tondini metallici
05467833808
BS
Vite
Viteria Lombarda
05567389302
MI
valori corrispondenti
sono completate
Bia
Bia
Bianchi
con valori nulli
Vitp
Viteria di Precisione
06443652006
MI
Bia
© Istituto Italiano Edizioni Atlas
Provincia
Clienti. Agenti.
IDAgente IDAgente
Ver
Verdi
LeBia
righe di Clienti
Bia senza
Bianchi
Bia
Bianchi
Isole
Nord
Nord
Nord
153
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Se su questa tabella si opera una selezione per considerare le sole righe con valori nulli nel
campo Agenti.IDAgente si ottiene l’elenco dei clienti ai quali è stato attribuito un codice
agente non corretto. Il risultato della selezione è mostrato in figura.
IDCliente
Ragione Sociale
PartitaIVA
Prome
Prodotti Metallici
05332518672
Provincia
BG
Clienti. Agenti.
IDAgente IDAgente
Nome
Zona
Gia
Il right join restituisce comunque tutte le righe della seconda tabella e di queste congiunge,
con le righe della prima tabella, solo quelle per le quali si possono trovare valori corrispondenti per gli attributi comuni. Nella congiunzione con il right join le righe senza corrispondenti
nella prima tabella sono completate con valori nulli. Congiungendo con un right join le tabelle
Clienti e Agenti sul campo IDAgente si ottiene la tabella in figura.
Clienti Right Join Agenti
IDCliente
Ragione Sociale
PartitaIVA
Lami
Lamiere per Auto
04357839912
Levi
Levigatoria Toscana
01528120155
Provincia
TO
FI
Clienti. Agenti.
IDAgente IDAgente
Bia
Ner
Nome
Zona
Bia
Bianchi
Nord
Bru
Bruni
Centro
Ner
Neri
Centro
Ner
Neri
Centro
Ner
Neri
Centro
Meta
Le righe di Agenti senza
Lucidatura Metalli
01572800164
RM
Ner
valori corrispondenti
sono completate
Metallurgica Emiliana 01583315265con valori
BO nulli Ner
Metb
Metalli Rari
01642877201
NA
Ros
Ros
Rossi
Sud
Otto
Ottonificio Pugliese
04687990657
BA
Ros
Ros
Rossi
Sud
Rame
Rame & Metalli
03568168943
PA
Ver
Ver
Verdi
Isole
Tond
Tondini metallici
05467833808
BS
Bia
Bia
Bianchi
Nord
Vite
Viteria Lombarda
05567389302
MI
Bia
Bia
Bianchi
Nord
Vitp
Viteria di Precisione
06443652006
MI
Bia
Bia
Bianchi
Nord
Luci
Ricercando nel right join le righe con valori nulli nel campo Clienti.IDAgente è possibile
identificare gli agenti ai quali non è associato alcun cliente, come succede, nell’esempio, per
l’agente di nome Bruni.
IDCliente
Ragione Sociale
PartitaIVA
Provincia
Clienti. Agenti.
IDAgente IDAgente
Bru
Nome
Zona
Bruni
Centro
I due esempi mostrano l’importanza di left join e right join per risolvere i problemi di assenza,
cioè problemi nei quali bisogna saper rispondere a quesiti del tipo: “chi sono gli agenti senza
clienti?”, “chi sono i clienti che non hanno effettuato alcun acquisto?”, “chi sono gli studenti
senza voti?”.
Vi è anche un join esterno di nome full join che combina le caratteristiche del left join con
quelle del right join includendo tutte le n-uple di entrambe le relazioni. Il full join di Clienti e
Agenti è mostrato nella figura seguente.
154
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Clienti Full Join Agenti
IDCliente
Ragione Sociale
PartitaIVA
Provincia
Lami
Lamiere per Auto
04357839912
TO
Clienti. Agenti.
IDAgente IDAgente
Bia
Nome
Zona
Bia
Bianchi
Nord
Bru
Bruni
Centro
Levi
Levigatoria Toscana
01528120155
FI
Ner
Ner
Neri
Centro
Luci
Lucidatura Metalli
01572800164
RM
Ner
Ner
Neri
Centro
Meta
Metallurgica Emiliana 01583315265
BO
Ner
Ner
Neri
Centro
Metb
Metalli Rari
01642877201
NA
Ros
Ros
Rossi
Sud
Otto
Ottonificio Pugliese
04687990657
BA
Ros
Ros
Rossi
Sud
Prome
Prodotti Metallici
05332518672
BG
Gia
Rame
Rame & Metalli
03568168943
PA
Ver
Ver
Verdi
Isole
Tond
Tondini metallici
05467833808
BS
Bia
Bia
Bianchi
Nord
Vite
Viteria Lombarda
05567389302
MI
Bia
Bia
Bianchi
Nord
Vitp
Viteria di Precisione
06443652006
MI
Bia
Bia
Bianchi
Nord
Il self join è una congiunzione con la quale vengono combinate righe di una tabella con righe
della stessa tabella quando sono presenti valori corrispondenti tra attributi, cioè due attributi
con lo stesso dominio.
La tabella della figura seguente, di nome Impiegati, elenca i dati di alcuni dipendenti con
l’indicazione del codice del rispettivo dirigente. Dalla tabella si vede, per esempio, che
Bianchi ha come dirigente Gatti che, a sua volta, dipende da Leoni. Volendo ottenere una
tabella dei dipendenti comprendente anche i dati anagrafici dei rispettivi dirigenti, si deve
congiungere la tabella Impiegati con una copia di se stessa. Le due tabelle vanno congiunte
sul campo Dir della prima e Codice della seconda. Per poter distinguere nella condizione di
congiunzione tra gli attributi di Impiegati e quelli della copia è necessario cambiare il nome
agli attributi di una delle due.
Impiegati
Codice
Cognome
Stipendio
1
Bianchi
26000
5
2
Neri
24000
5
3
Rossi
28000
5
4
Viola
30000
5
5
Gatti
40000
6
6
Leoni
45000
7
Mori
24000
© Istituto Italiano Edizioni Atlas
Dir
6
155
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Il risultato della congiunzione è mostrato in figura. Si osservi come agli attributi della
seconda tabella è stato cambiato nome, semplificando la lettura dei dati e, soprattutto,
rendendo possibile la scrittura della condizione di congiunzione.
ERIA
Cognome Stipendio
Dir
CognomeDir StipendioDir
DirDelDir
1
Bianchi
26000
5
Gatti
40000
6
2
Neri
24000
5
Gatti
40000
6
3
Rossi
28000
5
Gatti
40000
6
4
Viola
30000
5
Gatti
40000
6
5
Gatti
40000
6
Leoni
45000
7
Mori
24000
6
Leoni
45000
EB
W
LIBR
Codice
1. Operazioni insiemistiche
2. Prodotto cartesiano e theta join
4 Interrogazioni con più operatori
Le operazioni di selezione e di proiezione hanno come operando una sola tabella, mentre
l’operazione di congiunzione agisce su due o più tabelle.
Naturalmente gli operatori descritti possono essere applicati alle tabelle anche in successione,
combinando una selezione con una proiezione oppure una proiezione e una congiunzione: in
questo modo vengono effettuate interrogazioni sulle relazioni ottenute come risultato di un’interrogazione precedente.
Per esempio, per ottenere l’elenco delle ragioni sociali e degli agenti per i clienti della provincia
di Milano, occorre applicare la seguente sequenza di operatori:
1. σP Clienti
2. Temp1A
3. ΠL Temp2
Temp1 = Selezione di Clienti per Provincia = “MI”
AgentiA Temp2 = Congiunzione di Temp1 e Agenti su IDAgente
Proiezione di Temp2 su RagioneSociale, Nome.
Questa sequenza di operazioni attuata sulle tabelle Clienti e Agenti usate nei precedenti
esempi produce le tabelle riportate in figura.
1. Selezione di Clienti per Provincia = “MI”
156
IDCliente
RagioneSociale
PartitaIVA
Provincia
IDAgente
Vite
Viteria Lombarda
05567389302
MI
Bia
Vitp
Viteria di Precisione
06443652006
MI
Bia
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
2. Congiunzione di 1. con Agenti su IDAgente
IDCliente
Ragione Sociale
PartitaIVA
Provincia
Clienti. Agenti.
IDAgente IDAgente
Vite
Viteria Lombarda
05567389302
MI
Bia
Vitp
Viteria di Precisione
06443652006
MI
Bia
Nome
Zona
Bia
Bianchi
Nord
Bia
Bianchi
Nord
3. Proiezione di 2. su RagioneSociale, Nome
RagioneSociale
Nome
Viteria Lombarda
Bianchi
Viteria di Precisione
Bianchi
Volendo ottenere ragione sociale e partita IVA dei clienti della provincia di Bari, si può operare
nel seguente modo:
1. σP Clienti
2. ΠL Temp1
Temp1 = Selezione di Clienti per Provincia = “BA”
Proiezione di Temp1 su RagioneSociale, PartitaIVA
Nella costruzione delle precedenti interrogazioni, ottenute combinando più operatori, si è fatto
uso delle tabelle di nome Temp1 e Temp2 per indicare tabelle fittizie, risultato di operazioni
parziali.
Gli stessi nomi, scelti per indicare queste tabelle fittizie, vogliono suggerire l’idea che si tratta
di risultati temporanei ed evidenziare che tali tabelle non hanno esistenza nel database e
visibilità reale: è infatti il sistema di interrogazione del database che decide come eseguire
l’interrogazione per ottenere il risultato finale richiesto.
Si tratta di una semplificazione sintattica per indicare che una certa operazione viene eseguita
partendo dai risultati di operazioni precedenti. La situazione è analoga a quella di una espressione aritmetica quale:
(3 + 4) × (5 + 6)
che potrebbe essere espressa in forma equivalente:
T1 = 3 + 4;
T2 = 5 + 6;
T1 × T2
La sintassi adottata permette di scrivere espressioni complesse in modo relativamente semplice e di immediata lettura. Per esempio l’interrogazione per ottenere ragione sociale e partita
IVA dei clienti di Bari scritta in forma compatta, senza indicare risultati parziali fittizi, diventerebbe:
ΠRagioneSociale, PartitaIVA (σ
σProvincia=”BA” Clienti)
con il significato di:
Proiezione di (Selezione di Clienti per Provincia = “BA”) su RagioneSociale, PartitaIVA
© Istituto Italiano Edizioni Atlas
157
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
5 Esempi con modello E//R, tabelle e operazioni relazionali
PROGETTO 1
Un’organizzazione internazionale raggruppa gli iscritti di diverse nazioni. Gli iscritti possono aderire con ruoli diversi: socio ordinario, sostenitore, affiliato, ecc.;
l’importo della quota di iscrizione è libero e viene versato con pagamenti che
possono essere fatti in date diverse (anche più versamenti nello stesso anno senza
controlli di scadenze).
Costruire il modello E/R, definendo entità, attributi e associazioni e motivando le
scelte effettuate su entità e tipo di associazioni. Definire la procedura per la gestione dei dati. Produrre poi la pseudocodifica per le seguenti interrogazioni:
• iscritti con cognome, nome, telefono
• elenco degli iscritti (cognome, nome, tipo socio) di una nazione
• tutti i dati degli iscritti di un determinato tipo
• pagamenti con cognome, data, importo
• tutti i dati dei pagamenti effettuati nell’anno in corso con cognome e nome degli
iscritti che hanno effettuato i pagamenti
• pagamenti effettuati da un iscritto.
ANALISI DEI DATI
Le entità che possono essere individuate nel problema sono:
• Iscritto, per rappresentare le informazioni riguardanti i soci dell’organizzazione;
• Nazione, per gli Stati di appartenenza degli iscritti, essendo l’organizzazione di tipo internazionale;
• TipoAdesione, per i diversi tipi di ruoli con i quali i soci aderiscono (socio ordinario,
sostenitore, affiliato);
• Pagamento, per i versamenti delle quote di iscrizione.
Gli
Gli
Gli
Gli
attributi di Iscritto sono: codice dell’iscritto, cognome, nome, indirizzo, telefono.
attributi di Nazione sono: codice della nazione, descrizione.
attributi di TipoAdesione sono: codice del tipo, descrizione.
attributi di Pagamento sono: numero, importo, data del versamento.
Tra l’entità Nazione e l’entità Iscritto esiste un’associazione uno a molti, perché una
Nazione può avere molti iscritti e ciascun iscritto appartiene a una sola Nazione.
Tra l’entità TipoAdesione e l’entità Iscritto si può stabilire un’associazione uno a molti,
perché ci possono essere tanti iscritti per lo stesso tipo, ma un iscritto aderisce all’organizzazione secondo uno specifico ruolo.
Tra l’entità Iscritto e l’entità Pagamento si stabilisce un’associazione uno a molti, perché
nel testo del problema si prevede che un iscritto possa fare più versamenti, ma ogni
pagamento si riferisce a un solo iscritto.
158
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Sulla base dell’analisi effettuata si può disegnare il modello Entità/Associazioni:
MODELLO E/R
Pagamento
N
1
Effettuare
Numero {PK}
Data
Importo
Iscritto
ChiaveIscritto {PK}
Cognome
Nome
Indirizzo
Telefono
N
1
Risiedere
Nazione
ChiaveNazione {PK}
DescrNazione
N
Aderire
1
TipoAdesione
ChiaveTipo {PK}
DescrTipo
Nel modello E/R sono stati indicati i nomi dei versi delle associazioni e l’opzionalità od
obbligatorietà delle associazioni (indicate rispettivamente con linea tratteggiata o continua).
Il modello viene verificato utilizzando le regole di lettura:
Ogni tipo di adesione può essere riferito a uno o più iscritti, ogni iscritto deve aderire con
un solo tipo di adesione.
Ogni nazione può essere la residenza di uno o più iscritti, ogni iscritto deve risiedere in una
sola nazione.
Ogni iscritto può effettuare uno o più pagamenti, ogni pagamento deve essere effettuato
da un solo iscritto.
Utilizzando le regole di derivazione, si passa dal modello concettuale al modello logico, cioè
alle tabelle, introducendo le chiavi esterne per rappresentare le associazioni (le chiavi
primarie sono sottolineate, le chiavi esterne sono in corsivo).
TABELLE
TipiAdesione (ChiaveTipo, DescrTipo)
Nazioni (ChiaveNazione, DescrNazione)
Iscritti (ChiaveIscritto, Cognome, Nome, Indirizzo, Telefono, CodiceTipo, CodiceNazione)
Pagamenti (Numero, Data, Importo, CodiceIscritto).
L’associazione uno a molti tra TipoAdesione e Iscritto è stata rappresentata aggiungendo
agli attributi dell’entità a molti (Iscritto) la chiave esterna corrispondente alla chiave primaria
dell’entità a uno (TipoAdesione). La chiave esterna CodiceTipo corrisponde alla chiave
primaria ChiaveTipo.
© Istituto Italiano Edizioni Atlas
159
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
In modo analogo la chiave esterna CodiceNazione in Iscritti è associata alla chiave primaria
ChiaveNazione e la chiave esterna CodiceIscritto in Pagamenti è associata alla chiave
primaria ChiaveIscritto, per rappresentare le associazioni uno a molti rispettivamente tra
Nazione e Iscritto e tra Iscritto e Pagamento.
Lo schema seguente illustra le caratteristiche degli attributi delle tabelle.
Tabella
Campo
Chiave
Formato
Dimensione
TipiAdesione
ChiaveTipo
PK (Primaria)
Carattere
4
Carattere
15
Carattere
3
Carattere
20
Carattere
5
Cognome
Carattere
40
Nome
Carattere
30
Indirizzo
Carattere
30
Telefono
Carattere
12
DescrTipo
Nazioni
ChiaveNazione
PK (Primaria)
DescrNazione
Iscritti
Pagamenti
ChiaveIscritto
PK (Primaria)
CodiceTipo
FK (Esterna)
Carattere
4
CodiceNazione
FK (Esterna)
Carattere
3
Numero
PK (Primaria)
Numerico
6
Data
Data/ora
8
Importo
Numerico
12
Carattere
5
CodiceIscritto
FK (Esterna)
ANALISI DEL PROBLEMA
Il problema comprende la gestione di quattro tabelle, individuate dalle quattro entità
definite nel modello E/R. Le tabelle relative alle nazioni e ai tipi di adesione possono essere
definite come tabelle di controllo che vengono create nella fase iniziale per l’avviamento
del database e che, nel tempo, subiranno poche modifiche. Il programma di creazione di
tali tabelle deve, comunque, prevedere la possibilità di aggiornamento dei dati.
La gestione della tabella Iscritti, invece, può essere realizzata attraverso un tipico programma di aggiornamento che prevede le funzioni di inserimento, cancellazione e modifica dei
record contenuti nella tabella.
Per la tabella dei pagamenti la funzione di registrazione è realizzata principalmente da
operazioni di accodamento di nuovi record, anche se devono, comunque, essere previste
operazioni di modifica e di cancellazione. Le stampe di controllo del contenuto delle tabelle
Iscritti e Pagamenti sono demandate alle fasi di interrogazione del database.
Per quanto concerne le interrogazioni, ciascuna di esse può essere considerata una
funzione; per semplificare il funzionigramma le interrogazioni sono state raggruppate in
due categorie: la prima (Stampare iscritti) comprende le interrogazioni sui dati di tipo
descrittivo degli iscritti, la seconda (Controllare pagamenti) riguarda le interrogazioni che
coinvolgono anche i dati dei pagamenti.
160
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
GERARCHIA DELLE FUNZIONI
GESTIRE
ISCRITTI
Creare tabelle
di gestione
Creare Tipi
Adesione
Aggiornare
dati
Creare
Nazioni
Aggiornare
Iscritti
Registrare
Pagamenti
Interrogare
dati
Stampare
Iscritti
Controllare
Pagamenti
INPUT E OUTPUT DELLE FUNZIONI
Per le funzioni Creare Tipi Adesione, Creare Nazioni, Aggiornare Iscritti, Registrare Pagamenti, l’input è costituito dai dati digitati dall’utente e l’output è definito dalla corrispondente tabella aggiornata.
Per le interrogazioni l’input è definito dalle tabelle che contengono i dati coinvolti nelle
interrogazioni; l’output, per i database relazionali, è costituito ancora da una tabella, tale
tabella può essere, a sua volta, oggetto di interrogazioni oppure, come in questo caso, può
essere visualizzata su video o stampata.
SCHEMA
DELLE RISORSE DI SISTEMA
Creare Tipi
Adesione
Creare
Nazioni
TipiAdesione
Nazioni
Aggiornare
Iscritti
Registrare
Pagamenti
Iscritti
Pagamenti
Stampare
Iscritti
© Istituto Italiano Edizioni Atlas
Controllare
Pagamenti
161
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
INTERROGAZIONI
(le costanti utilizzate nelle condizioni di ricerca sono indicate tra parentesi quadre)
Iscritti con cognome, nome, telefono
ΠL Iscritti
Proiezione di Iscritti su Cognome, Nome, Telefono
Elenco degli iscritti (cognome, nome, tipo socio) di una Nazione
1. σP Nazioni
2. Temp1PK
IscrittiFK
3. Temp2FK
TipiAdesionePK
4. ΠL Temp3
Temp1 = Selezione di Nazioni per DescrNazione = [nazione scelta]
Temp2 = Congiunzione di Temp1 su ChiaveNazione e Iscritti su
CodiceNazione
Temp3 = Congiunzione di Temp2 su CodiceTipo e TipiAdesione su
ChiaveTipo
Proiezione di Temp3 su Cognome, Nome, DescrTipo
Tutti i dati degli iscritti di un determinato tipo
1. σP TipiAdesione
2. Temp1PK
IscrittiFK
Temp1 = Selezione di TipiAdesione per DescrTipo = [tipo scelto]
Congiunzione di Temp1 su ChiaveTipo e Iscritti su CodiceTipo
Pagamenti con cognome, data, importo
1. IscrittiPK
PagamentiFK
2. ΠL Temp1
Temp1 = Congiunzione di Iscritti su ChiaveIscritto e Pagamenti su
CodiceIscritto
Proiezione di Temp1 su Cognome, Data, Importo
I dati dei pagamenti effettuati nell’anno in corso con cognome e nome degli iscritti che
hanno effettuato i pagamenti
1. σP Pagamenti
2. ΠL Iscritti
3. Temp1FK
Temp2PK
Temp1 = Selezione di Pagamenti per Data compresa tra 1 gennaio
e 31 dicembre dell’anno in corso
Temp2 = Proiezione di Iscritti su ChiaveIscritto, Cognome, Nome
Congiunzione di Temp1 su CodiceIscritto e Temp2 su ChiaveIscritto
Pagamenti effettuati da un iscritto
1. σP Iscritti
2. ΠL Temp1
3. Temp2PK
PagamentiFK
Temp1 = Selezione di Iscritti per Cognome = [cognome scelto]
Temp2 = Proiezione di Temp1 su ChiaveIscritto
Congiunzione di Temp2 su ChiaveIscritto e Pagamenti su
CodiceIscritto
PROGETTO 2
I pazienti di un reparto di chirurgia sono ricoverati in stanze con differenti dotazioni (telefono, televisore, aria condizionata). I pazienti vengono operati da un chirurgo; si devono registrare anche data, ora e sala operatoria nella quale il paziente
viene operato.
Derivare dal modello E/R il corrispondente modello relazionale dei dati e produrre
la pseudocodifica per le seguenti interrogazioni:
• pazienti operati da un dato chirurgo con cognome, nome, indirizzo
• pazienti che hanno scelto una stanza con televisore (con cognome, nome, e data
di inizio del ricovero)
• pazienti ricoverati in un certo mese (con cognome e nome).
Il modello E/R del problema è stato discusso negli esempi del Paragrafo 7 nel Capitolo 3.
Completiamo l’esempio con la derivazione del modello logico e la codifica delle interrogazioni.
Applicando le regole di derivazione del modello logico, si definiscono tre relazioni in
corrispondenza delle tre entità Stanza, Paziente, Chirurgo.
162
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
L’associazione Operare, di tipo 1:N, tra Chirurgo e Paziente viene modellata aggiungendo
agli attributi dell’entità che sta dalla parte N, ossia Paziente, la chiave di Chirurgo che sta
dalla parte 1 dell’associazione, oltre agli attributi dell’associazione stessa.
L’associazione tra Stanza e Paziente, di tipo 1:N viene rappresentata aggiungendo agli
attributi di Paziente la chiave di Stanza e gli attributi dell’associazione.
Lo schema relazionale derivato è il seguente:
Stanze (Numero, Telefono, Televisore, AriaCond)
Chirurghi (Codice, Cognome, Nome, Specialità)
Pazienti (Codice, Cognome, Nome, Indirizzo, NumTelef, CodiceChirurgo, DataIntervento,
OraIntervento, SalaOperatoria, NumeroStanza, InizioRicovero, FineRicovero)
Le chiavi primarie delle due relazioni sono sottolineate, mentre le chiavi esterne sono
indicate in corsivo. Si osservi che la tabella Pazienti, sulla base delle ipotesi di semplificazione del problema, non rappresenta una tabella anagrafica, ma i dati relativi alla degenza
e all’intervento dei diversi pazienti.
Lo schema seguente illustra le caratteristiche degli attributi delle tabelle. Gli attributi
Telefono, Televisore, AriaCond, che caratterizzano alcune opzioni della stanza dove il paziente è ricoverato, sono attributi di tipo logico (valore vero o falso). Rappresentiamo i valori
di questo attributo con un carattere “S” oppure “N” (sì o no).
Relazione
Stanze
Chirurghi
Pazienti
Attributo
Numero
Telefono
Televisore
AriaCond
Codice
Cognome
Nome
Specialità
Codice
Cognome
Nome
Indirizzo
NumTelef
CodiceChirurgo
DataIntervento
OraIntervento
SalaOperatoria
NumeroStanza
InizioRicovero
FineRicovero
Chiave
PK (Primaria)
PK (Primaria)
PK (Primaria)
FK (Esterna)
FK (Esterna)
Formato
numerico
carattere
carattere
carattere
numerico
carattere
carattere
carattere
numerico
carattere
carattere
carattere
carattere
numerico
data/ora
data/ora
numerico
numerico
data/ora
data/ora
Dimensione
4
1
1
1
4
30
20
10
4
30
20
40
12
4
8
8
4
4
8
8
ANALISI DEL PROBLEMA
Il problema comprende la gestione di tre tabelle, individuate dalle tre entità definite nel
modello E/R. Le tabelle relative alle stanze e ai chirurghi vengono create nella fase iniziale
per l’avviamento del database e, nel tempo, subiranno poche modifiche. La gestione di tali
tabelle deve, comunque, prevedere la possibilità di aggiornamento dei dati.
© Istituto Italiano Edizioni Atlas
163
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
La gestione della tabella Pazienti è, invece, di tipo dinamico, in quanto deve registrare gli
interventi e i ricoveri con le date di inizio e di fine: può essere realizzata attraverso una
tipica procedura di aggiornamento che prevede le funzioni di inserimento, cancellazione e
modifica dei record contenuti nella tabella.
Per semplificare il funzionigramma, le interrogazioni richieste dal problema sono state
raggruppate sotto la funzione Gestire ricoveri.
GERARCHIA DELLE FUNZIONI
GESTIRE REPARTO
Creare tabelle di gestione
Gestire pazienti
Gestire ricoveri
Creare tabella stanze
Inserire nuovo paziente
Elenco pazienti operati
Creare tabella chirurghi
Cancellare paziente
Scelte della stanza
Aggiornare dati paziente
Ricoveri di un mese
INPUT E OUTPUT DELLE FUNZIONI
Per le funzioni Creare tabella stanze, Creare tabella chirurghi e Gestire pazienti l’input è
costituito dai dati digitati dall’utente e l’output è definito dalla corrispondente tabella aggiornata. Per le interrogazioni l’input è definito dalle tabelle che contengono i dati coinvolti nelle
interrogazioni; l’output può essere visualizzato su video o sulla carta della stampante.
SCHEMA DELLE
RISORSE DI SISTEMA
Creare tabella
stanze
Gestire
pazienti
Stanze
Pazienti
Chirurghi
Gestire
ricoveri
Creare
tabella chirurghi
164
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
INTERROGAZIONI
(le costanti utilizzate nelle condizioni di ricerca sono indicate tra parentesi quadre)
Elenco dei pazienti operati da un dato chirurgo, con nome, cognome, indirizzo
1. σP Chirurghi
2. PazientiFK
3. ΠL Temp2
Temp1PK
Temp1 = Selezione di Chirurghi per Cognome = [cognome scelto]
e Nome = [nome scelto]
Temp2 = Congiunzione di Pazienti su CodiceChirurgo e Temp1 su Codice
Proiezione di Temp2 su Paziente.Nome, Paziente.Cognome, Indirizzo
Pazienti che hanno scelto una stanza con televisore (con nome, cognome, e data inizio
ricovero)
1. σP Stanze
2. PazientiFK
3. ΠL Temp2
Temp1 = Selezione di Stanze per Televisore = “S”
Temp1PK Temp2 = Congiunzione di Pazienti su NumeroStanza e Temp1 su Numero
Proiezione di Temp2 su Paziente.Nome, Paziente.Cognome, InizioRicovero
Pazienti ricoverati in un certo mese (con nome e cognome)
Temp1 = Selezione di Pazienti per InizioRicovero = [mese scelto]
Proiezione di Temp1 su Paziente.Nome, Paziente.Cognome
ERIA
EB
W
LIBR
1. σP Pazienti
2. ΠL Temp1
3. Esempio con modello E/R, tabelle e operazioni: Gestione ordini
AUTOVERIFICA
Domande da 14 a 25 pag. 179-181
Problemi da 6 a 15 pag. 183-185
6 La normalizzazione delle relazioni
La tabella Inventario contiene informazioni sulle merci presenti nei diversi negozi di una catena
di supermercati distribuiti sul territorio nazionale. Dall’esame della prima riga di inventario si
vede che ci sono 800 pezzi del prodotto di codice 545 nel magazzino CA1, situato in via Tonale
12, l’ultima riga evidenzia 720 unità del prodotto 100 posti in Calle Corta, sede del magazzino VE1.
Inventario
Prodotto
Magazzino
Quantità
IndirizzoMagazzino
545
CA1
800
Via Tonale, 12
545
PA2
700
Via Mazzini, 25
545
VE1
356
Calle Corta, 5
100
CA1
245
Via Tonale, 12
200
VE1
230
Calle Corta, 5
545
PA1
370
Via Garibaldi, 38
100
PA2
350
Via Mazzini, 25
100
VE1
720
Calle Corta, 5
La tabella Inventario non è una tabella ben organizzata: l’indirizzo di un certo magazzino viene
ripetuto ogni volta che quel magazzino è referenziato tramite il codice e, pertanto, i dati nel
campo IndirizzoMagazzino sono ridondanti.
© Istituto Italiano Edizioni Atlas
165
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
La ridondanza va evitata, non solo perché viene sprecato spazio su disco ma, soprattutto, per
le possibili anomalie che si possono presentare nel corso delle diverse fasi del trattamento
dei dati:
• anomalia di aggiornamento: se il magazzino CA1 cambia indirizzo bisogna modificare il valore
di IndirizzoMagazzino in tutte le occorrenze di CA1 di Inventario; se, per qualsiasi ragione,
l’aggiornamento avviene solo in alcune delle righe interessate, i dati memorizzati diventano
inconsistenti;
• anomalia di cancellazione: se un magazzino si svuota vengono perse le informazioni sul suo
indirizzo;
• anomalia di inserimento: quando viene aperto un nuovo magazzino, in mancanza di merci a
magazzino, mancano le informazioni sul suo indirizzo.
Per evitare la ridondanza di IndirizzoMagazzino possiamo pensare di sostituire alla tabella
Inventario una coppia di tabelle: Inventario e Negozi, descritte dagli schemi:
Inventario (Prodotto, Magazzino, Quantità)
Negozi (CodiceMagazzino, IndirizzoMagazzino)
La chiave di Inventario è formata dagli attributi Prodotto e Magazzino, in quanto il solo codice
del prodotto non identifica la merce, che può essere presente in magazzini diversi.
È poi evidente che la scomposizione nelle due tabelle non causa perdita di informazione, in
quanto la tabella di partenza potrà essere ricostruita mediante congiunzione di Inventario su
Magazzino e Negozi su CodiceMagazzino.
Sono state definiti opportuni criteri che devono essere soddisfatti dalle relazioni per evitare la
ridondanza dei dati e le possibili anomalie che ne conseguono. Tali criteri definiscono le
caratteristiche che devono essere soddisfatte da una relazione ben strutturata e prendono il
nome di forme normali: sono di livello crescente, e sono accompagnate da algoritmi per la
trasformazione di una tabella, che viola una forma normale, in un insieme di tabelle che
rispettano il criterio violato. Il processo di trasformazione prende il nome di normalizzazione
ed è garantita la conservazione dell’informazione.
La normalizzazione completa il processo di progettazione di un database relazionale. Dopo
avere progettato il database a livello concettuale, mediante la costruzione del modello E/R dei
dati, e avere derivato le conseguenti relazioni in base alle regole viste in questo capitolo, la
normalizzazione esamina le tabelle alla ricerca di possibili incongruenze nella loro definizione.
In sostanza la normalizzazione consente di creare tabelle ben definite, che facilitano le operazioni
di aggiunta, modifica e cancellazione delle informazioni, e che rendono possibili i cambiamenti
nella struttura del modello con l’evolvere delle esigenze aziendali e degli utenti del database.
Nel seguito della trattazione saranno utilizzati alcuni termini di cui si forniscono le definizioni:
• la chiave o chiave primaria è l’insieme di uno o più attributi che identificano in modo
univoco una n-upla (riga della tabella);
• la chiave candidata è un insieme minimale di uno o più attributi che possono svolgere
la funzione di chiave (ci possono essere molte chiavi candidate, ma una sola chiave
primaria);
• l’attributo non-chiave è un campo che non fa parte della chiave primaria.
Consideriamo il seguente schema relazionale che descrive la relazione Inventario, modificata
rispetto alla tabella discussa in precedenza, con l’aggiunta dell’attributo NumeroInventario, che
identifica univocamente ogni riga della tabella.
Inventario (NumeroInventario, Prodotto, Magazzino, Quantità, IndirizzoMagazzino)
166
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Per le osservazioni fatte all’inizio di questo paragrafo possiamo dire che:
- NumeroInventario è una chiave candidata,
- Prodotto non è una chiave candidata e così non lo può essere Magazzino,
- l’insieme {Prodotto, Magazzino} è una chiave candidata,
- l’insieme {Prodotto, Magazzino, Quantità} non è una chiave candidata, perché contiene un
sottoinsieme {Prodotto, Magazzino} che è una chiave candidata.
Il progettista della base di dati può scegliere la chiave primaria, tra le due possibili chiavi
candidate, in base alle specifiche esigenze del sistema informativo che sta progettando.
Si ha dipendenza funzionale tra attributi quando il valore di un insieme di attributi A
determina un singolo valore dell’attributo B e si indica con: A → B. Si dice anche che B
dipende funzionalmente da A, o che A è un determinante per B.
Se un attributo è chiave candidata di una relazione, allora è un determinante per ogni attributo
della relazione e, viceversa, un attributo, che sia un determinante per ogni attributo di una
relazione, è chiave candidata per la relazione stessa.
Nel caso della relazione Inventario:
NumeroInventario è determinante per ogni attributo di Inventario essendo una chiave candidata:
NumeroInventario → (Prodotto, Magazzino, Quantità, IndirizzoMagazzino)
{Prodotto, Magazzino} è determinante per ogni attributo di Inventario, in quanto chiave candidata:
{Prodotto, Magazzino} → (NumeroInventario, Quantità, IndirizzoMagazzino)
Magazzino è determinante per Indirizzo Magazzino:
Magazzino → IndirizzoMagazzino
Si ha dipendenza transitiva tra attributi quando un attributo A determina B e B determina C; si dice allora che C dipende transitivamente da A:
se A → B e B → C, allora A → C transitivamente.
Vengono esaminate ora le principali forme normali nel modello relazionale.
Prima forma normale
Una relazione è in prima forma normale (1FN) quando rispetta i requisiti fondamentali
del modello relazionale (già visti in precedenza), che sono:
• tutte le righe della tabella contengono lo stesso numero di colonne;
• gli attributi rappresentano informazioni elementari;
• i valori che compaiono in una colonna sono dello stesso tipo, cioè appartengono allo
stesso dominio;
• ogni riga è diversa da tutte le altre, cioè non ci possono essere due righe con gli stessi
valori nelle colonne;
• l’ordine con il quale le righe compaiono nella tabella è irrilevante.
In particolare gli attributi devono essere informazioni non ulteriormente scomponibili, cioè
non devono avere sottoattributi, né essere gruppi di attributi ripetuti.
© Istituto Italiano Edizioni Atlas
167
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Per esempio, nella relazione:
Dipendenti (Matricola, Cognome, Nome, Città, FamiliariACarico)
l’attributo FamiliariACarico non è elementare, in quanto è costituito da un gruppo di attributi
ripetuti dello stesso tipo (i nomi dei familiari). La relazione non è in prima forma normale.
La relazione può essere opportunamente convertita in due tabelle:
Dipendenti (Matricola, Cognome, Nome, Città)
Familiari (CodiceFam, CognomeFam, NomeFam, MatricolaDip)
Dipendenti
Matricola
Cognome
Nome
Città
Familiari a Carico
Rossi Alice
12001
Rossi
Antonio
Milano
Rossi Marco
Antonini Marcella
14007
18009
Dipendenti
Familiari
Matricola Cognome
Nome
Indirizzo
CodiceFam CognomeFam NomeFam MatricolaDip
12001
Antonio
Milano
50001
Rossi
Alice
12001
14007
50002
Rossi
Marco
12001
18009
50003
Antonini
Marcella
12001
Rossi
In questo modo vengono individuati due oggetti distinti, Dipendente e Familiare, fornendo una
rappresentazione più precisa della realtà: inoltre risulta più facile aggiungere eventuali nuovi
attributi (per esempio, età, sesso, grado di parentela alla relazione Familiari).
Anche l’inserimento di un nuovo figlio a carico del dipendente diventa semplice, in quanto
viene aggiunta una riga alla tabella Familiari, senza modificare la struttura delle relazioni; inoltre
possiamo comunque ritrovare le informazioni sul capofamiglia attraverso un’operazione di
congiunzione tra la relazione Dipendenti e la relazione Familiari sull’attributo comune matricola
del dipendente.
Le forme normali superiori alla prima vengono introdotte per eliminare problemi durante le
operazioni di aggiornamento o di cancellazione, evitando l’inconsistenza o la perdita indesiderata di dati.
Seconda forma normale
Una relazione è in seconda forma normale (2FN) quando è in prima forma normale e
tutti i suoi attributi non-chiave dipendono dall’intera chiave, cioè non possiede attributi che
dipendono soltanto da una parte della chiave. La seconda forma normale elimina la dipendenza parziale degli attributi dalla chiave e riguarda il caso di relazioni con chiavi composte,
cioè formate da più attributi.
168
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
La relazione Inventario definita dallo schema:
Inventario (Prodotto, Magazzino, Quantità, IndirizzoMagazzino)
non è in seconda forma normale; infatti l’attributo IndirizzoMagazzino dipende funzionalmente
dall’attributo Magazzino, che rappresenta una porzione di chiave e non l’intera chiave. La
soluzione, come abbiamo visto, consiste nel costruire nuove relazioni, togliendo dalla relazione
di partenza gli attributi che dipendono solo parzialmente dalla chiave primaria.
La scomposizione inizia costruendo uno schema di relazione che comprende tutti gli attributi
presenti nella dipendenza funzionale che viola la seconda forma normale, il determinante della
dipendenza funzionale diventa quindi la chiave della nuova relazione:
Magazzino → IndirizzoMagazzino
R1 (Magazzino, IndirizzoMagazzino)
Il passo successivo consiste nel costruire una seconda relazione R2 composta dagli attributi
dello schema di partenza privato dell’attributo che dipende parzialmente dalla chiave.
R2 (Prodotto, Magazzino, Quantità)
Il procedimento viene iterato sino a che tutte le relazioni sono in seconda forma normale (2FN),
cioè non ci sono attributi non-chiave che dipendono funzionalmente solo da una parte della
chiave.
Nel caso discusso in precedenza sono state costruite le due nuove relazioni Inventario e
Negozi, ottenute con la proiezione della relazione di partenza sugli attributi degli schemi R2
(Inventario) e, rispettivamente, R1 (Negozi).
Inventario
Negozi
Prodotto Magazzino Quantità
Magazzino
IndirizzoMagazzino
545
CA1
800
CA1
Via Tonale, 12
545
PA2
700
PA1
Via Garibaldi, 38
545
VE1
356
PA2
Via Mazzini, 25
100
CA1
245
VE1
Calle Corta, 5
200
VE1
230
545
PA1
370
100
PA2
350
100
VE1
720
Si consideri la relazione R il cui schema è una variante di quello di Inventario:
R (Prodotto, Magazzino, Qta, NomeProdotto, IndirizzoMagazzino)
In R valgono le seguenti dipendenze funzionali:
1. {Prodotto, Magazzino} → (Qta, NomeProdotto, IndirizzoMagazzino)
2. Prodotto → NomeProdotto
3. Magazzino → IndirizzoMagazzino
© Istituto Italiano Edizioni Atlas
169
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Si osserva che: { Prodotto, Magazzino } è una chiave di R in quanto, per effetto della dipendenza
funzionale 1, è un determinate per tutti gli attributi di R e che, inoltre, R non è in 2FN a causa
della dipendenza funzionale 2, in quanto NomeProdotto dipende solo parzialmente dalla chiave
e non dall’intera chiave. Si osserva che anche la dipendenza funzionale 3 rappresenta una
violazione alla 2FN, perché l’attributo Magazzino, che non è l’intera chiave di R, è determinante
di IndirizzoMagazzino.
Il processo di normalizzazione inizia considerando una delle dipendenze funzionali che violano
le regole della normalizzazione: scegliamo la dipendenza funzionale 2. Si costruisce una tabella
R1 con tutti gli attributi della dipendenza funzionale 2, secondo la quale Prodotto è chiave per
R1. Da R si rimuovono poi tutti gli attributi che sono determinati funzionalmente da Prodotto,
cioè il solo attributo NomeProdotto. Si ottengono così le relazioni:
R1 (Prodotto, NomeProdotto)
R (Prodotto, Magazzino, Qta, IndirizzoMagazzino)
Il processo di normalizzazione prosegue considerando la dipendenza funzionale 3, per effetto
della quale R non è in 2FN. Procedendo come al passo precedente R si scompone in:
R2 (Magazzino, IndirizzoMagazzino)
R (Prodotto, Magazzino, Qta)
Complessivamente la relazione di partenza:
R (Prodotto, Magazzino, Qta, NomeProdotto, IndirizzoMagazzino )
è stata scomposta in:
R1 (Prodotto, NomeProdotto )
R2 (Magazzino, IndirizzoMagazzino)
R (Prodotto, Magazzino, Qta)
Sulla base dei due esempi appena discussi formalizziamo il processo di normalizzazione di una
relazione mediante il seguente algoritmo di scomposizione.
Algoritmo di scomposizione di una relazione T
1. Si identifichino tutte le dipendenze funzionali e le chiavi candidate in T.
2. Se esiste una dipendenza funzionale che viola le regole di normalizzazione:
a. si costruisca una nuova relazione con tutti gli attributi della dipendenza funzionale
considerata;
b. il determinante della dipendenza funzionale è la chiave primaria della tabella definita
in a;
c. si costruisca una seconda relazione rimuovendo dalla tabella di partenza tutti gli
attributi che sono determinati dalla dipendenza funzionale in esame.
3. Si ripeta il passo 2. finché non ci sono altre violazioni alle regole di normalizzazione.
La normalizzazione è un procedimento algoritmico definito con precisione e quindi, almeno in
apparenza, di semplice attuazione. In realtà nasconde un aspetto che richiede molta attenzione. L’algoritmo di scomposizione è eseguibile in modo automatico solo dopo avere completato
il punto 1 del processo, ovvero dopo avere individuato tutte le dipendenze funzionali nella
tabella da normalizzare. Questo passo, che non è automatizzabile, richiede una precisa conoscenza della realtà che la tabella vuole modellare e rappresenta un problema di complessità
paragonabile a quella che si incontra nella costruzione del modello concettuale dei dati.
170
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Terza forma normale
Una relazione è in terza forma normale (3FN) quando è in seconda forma normale e
tutti gli attributi non-chiave dipendono direttamente dalla chiave, cioè non possiede attributi
non-chiave che dipendono da altri attributi non-chiave. La terza forma normale elimina la
dipendenza transitiva degli attributi dalla chiave.
Per esempio si consideri la gestione anagrafica di un’associazione di studenti di scuole diverse.
Le informazioni più importanti sono rappresentate con la seguente relazione:
Studenti (Cognome, Scuola, TelefonoScuola)
Studenti
Cognome
Scuola
TelefonoScuola
Bianchi
ITC Paleari
02-2538469
Leoni
Liceo Dante
06-3845287
Galli
ITIS Leonardo
011-3377659
Negri
Liceo Dante
06-3845287
Rossi
ITC Paleari
02-2538469
Lorenzini
ITIS Galvani
081-5416875
Verdi
Liceo Dante
06-3845287
Bedoni
Liceo Fermi
045-2345613
Nella tabella in esame valgono le seguenti dipendenze funzionali:
1. Cognome → (Scuola, TelefonoScuola)
2. Scuola → TelefonoScuola
La dipendenza funzionale 2 è evidente: nota la scuola, è definito il valore dell’attributo con il
numero di telefono. La dipendenza funzionale 1 è basata sul fatto che, partendo dal nominativo
di uno studente, se ne conosce la scuola di appartenenza e quindi (transitivamente) anche il
relativo numero di telefono. La dipendenza funzionale 1 conferma il fatto che l’attributo Cognome sia una chiave per Studenti.
La relazione Studenti non è in terza forma normale a causa della seconda dipendenza funzionale, perché l’attributo TelefonoScuola dipende transitivamente (e non direttamente) da una
chiave (Cognome).
Come si è visto per la seconda forma normale, anche in questo caso si possono avere
anomalie nell’aggiornamento e inconsistenza dei dati per il fatto che il telefono della scuola è
ripetuto per ogni studente appartenente a quella scuola.
La normalizzazione in 3FN si ottiene applicando l’algoritmo di scomposizione. Identificata la
dipendenza funzionale che viola le regole di normalizzazione, si costruisce una relazione con
tutti gli attributi della dipendenza funzionale in esame, cioè della dipendenza funzionale 2, e con
chiave Scuola:
Istituti (Scuola, TelefonoScuola)
Una seconda relazione è ottenuta eliminando da Studenti l’unico attributo determinato da
Scuola, cioè TelefonoScuola.
Studenti (Cognome, Scuola)
© Istituto Italiano Edizioni Atlas
171
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Il procedimento termina perchè non ci sono altre dipendenze funzionali che violano le regole
di normalizzazione. Si osservi che, nella tabella Studenti normalizzata, l’attributo Scuola è una
chiave esterna associata alla chiave primaria di Istituti. Sulla base di questa osservazione è
possibile descrivere l’algoritmo di scomposizione in modo differente: costruito uno schema di
relazione con tutti gli attributi della dipendenza funzionale che viola le regole di normalizzazione,
si costruisce un secondo schema di tabella eliminando dallo schema di partenza tutti gli
attributi della dipendenza funzionale, ma aggiungendo agli attributi rimasti, come chiave esterna, il determinante della dipendenza funzionale. In ogni caso si è scomposto lo schema della
relazione di partenza nella coppia di relazioni:
Studenti (Cognome, Scuola)
Istituti (Scuola, TelefonoScuola)
La proiezione della relazione di partenza sugli attributi di questi due schemi produce le tabelle:
Studenti
Istituti
Cognome
Scuola
Scuola
TelefonoScuola
Bianchi
ITC Paleari
ITC Paleari
02-2538469
Leoni
Liceo Dante
ITIS Leonardo
011-3377659
Galli
ITIS Leonardo
ITIS Galvani
081-5416875
Negri
Liceo Dante
Liceo Dante
06-3845287
Rossi
ITC Paleari
Liceo Fermi
045-2345613
Lorenzini
ITIS Galvani
Verdi
Liceo Dante
Bedoni
Liceo Fermi
Le relazioni Studenti e Istituti, dove non ci sono attributi non-chiave che dipendono funzionalmente
da un altro attributo non-chiave (cioè che dipendono in modo transitivo dalla chiave), si dicono
in terza forma normale (3FN).
Come ulteriore esempio si consideri la tabella Dipendenti di schema:
Dipendenti (Matricola, Cognome, Nome, CodReparto, NomeReparto, CodiceCittà, NomeCittà)
dove si suppongono valide le seguenti dipendenze funzionali:
1. Matricola → (Cognome, Nome, CodReparto, NomeReparto, CodiceCittà, NomeCittà)
2. CodReparto → NomeReparto
3. CodiceCittà → NomeCittà
In base alla dipendenza funzionale 1 si può affermare che Matricola è una chiave per Dipendenti, mentre le dipendenze funzionali 2 e 3 sono indicative di due violazioni alla 3FN perché
sia NomeReparto che NomeCittà dipendono transitivamente, e non direttamente, da una
chiave.
Applichiamo l’algoritmo di scomposizione alla relazione Dipendenti partendo dalla dipendenza
funzionale 2, ottenendo:
Reparti (CodReparto, Nome Reparto)
Dipendenti (Matricola, Cognome, Nome, CodReparto, CodiceCittà, NomeCittà)
172
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Il nuovo schema di Dipendenti non è ancora in 3FN a causa delle dipendenza funzionale 3.
L’ulteriore scomposizione di Dipendenti produce uno schema di relazione di nome Città e la
versione finale dello schema di Dipendenti:
Reparti (CodReparto, Nome Reparto)
Città (CodiceCittà, NomeCittà)
Dipendenti (Matricola, Cognome, Nome, CodReparto, CodiceCittà)
ERIA
EB
W
LIBR
Il procedimento termina perché non ci sono più dipendenze funzionali che violano le regole di
normalizzazione.
Gli esempi considerati descrivono come si attua la normalizzazione scomponendo, ove necessario, lo schema di una relazione di partenza in due o più schemi più semplici, allo scopo di
ridurre la ridondanza dei dati e di conseguenza la possibilità di inconsistenza. Si osservi però
che la normalizzazione rende più complesse le operazioni di ritrovamento dei dati. Si supponga,
riferendoci all’ultimo esempio, di voler conoscere il nome del reparto dove lavora un dipendente di cui si conosce la matricola. È immediato osservare che prima della normalizzazione
l’informazione era recuperabile accedendo alla sola tabella Dipendenti, mentre, dopo la
normalizzazione, per recuperare questa informazione bisogna unire le relazioni Dipendenti e
Reparti con un join sul campo CodReparto. La normalizzazione è comunque importante nel
modello di un database perché l’integrità e la consistenza dei dati sono prioritarie rispetto alla
velocità di ritrovamento dei dati.
Tutto questo è vero in particolare nei database operativi dove i dati sono continuamente
aggiornati e, di conseguenza, la ridondanza delle informazioni e il rischio di inconsistenza dei
dati è reale. Ci sono però particolari database dove la ridondanza delle informazioni è tollerata
e, anzi, è addirittura voluta: si tratta dei database di sola lettura, ovvero di basi di dati che non
sono mai modificate, ma accedute solamente in lettura, per analizzare dati a scopo informativo. Questo avviene, per esempio, nei database per applicazioni direzionali dove i dati operativi
sono elaborati e sintetizzati e successivamente analizzati per estrarre informazioni a supporto
delle strategie elaborate dai manager. In questi casi i dati, una volta prodotti, non sono mai
modificati e diventa importante solo la velocità con la quale si riesce ad accedere a queste
informazioni.
Volendo sintetizzare i contenuti di questo paragrafo diciamo che, attraverso la normalizzazione
una relazione iniziale viene scomposta in più relazioni, che complessivamente forniscono le
stesse informazioni di partenza e mantengono le dipendenze tra gli attributi: in ciascuna di
esse ogni attributo dipende direttamente dalla chiave; vengono inoltre evitati problemi di
ridondanza e di inconsistenza dei dati. Nella scomposizione non c’è perdita complessiva delle
informazioni, perché i dati possono essere ritrovati attraverso operazioni di congiunzione tra le
relazioni sugli attributi comuni, senza aggiunta di nuove n-uple nelle relazioni.
4. Forma normale di Boyce-Codd
7 L’integrità referenziale
Nella definizione dei concetti fondamentali del modello relazionale è già stata presentata una
regola di integrità sui dati, l’integrità sull’entità o vincolo di chiave, che non consente valori
nulli e valori duplicati per la chiave. Il modello relazionale possiede altre regole di integrità dei
dati e, in particolare, sussistono vincoli di tupla e vincoli d’integrità referenziale.
Le tabelle in figura raccolgono le informazioni su alcuni studenti di un distretto scolastico che
raggruppa diverse scuole. Gli studenti del distretto sono identificati per mezzo dell’attributo
Matricola e le diverse scuole dal valore dei rispettivi codici.
© Istituto Italiano Edizioni Atlas
173
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Studenti
Scuole
Matricola
Cognome
Nome
DataNascita
CodScuola
Codice
NomeScuola
545
Rossi
Maria
NULL
125
125
ITC Manzoni
653
Neri
Anna
20-set-94
125
180
Liceo Dante
768
Verdi
Giuseppe
30-ott-96
NULL
190
Liceo Fermi
653
Rossi
Franco
32-ott-94
180
NULL
ITIS Galvani
314
Bruni
Enrico
27-ott-95
185
Osserviamo le due tabelle Studenti e Scuole; in esse sono stati evidenziati alcuni dati che
invalidano i corrispondenti record. Non è nota la scuola frequentata dallo studente di matricola
768, la data di nascita di Rossi è assurda, lo studente Bruni frequenta una scuola di codice
inesistente nella tabella Scuole. All’istituto Galvani non è abbinato alcun valore della chiave e,
di conseguenza, non è possibile collegarlo con gli studenti che lo frequentano.
Per prevenire situazioni di questo tipo sono state definite opportune regole di integrità sui
dati tra le quali ricordiamo la già citata integrità di chiave che impedisce la presenza di una riga
con valore nullo della chiave. Si noti che è proprio questa la regola d’integrità violata in Scuole.
I vincoli di tupla esprimono condizioni che devono essere soddisfatte dai valori di
ciascuna n-upla della relazione, indipendentemente dalle altre.
La data di nascita di Rossi è un esempio di violazione di un vincolo di dominio, in quanto il
valore 32-ott-94 non ricade nell’insieme delle date ammissibili. La natura del problema analizzato porta a definire i vincoli ai quali devono sottostare i dati. Per esempio, l’attributo CodScuola
di Studenti, porta a concludere che tale attributo non possa assumere valori nulli per prevenire
situazioni quali quella dello studente di matricola 768.
L’integrità referenziale (referential integrity) è un insieme di regole del modello relazionale
che garantiscono l’integrità dei dati quando si hanno relazioni associate tra loro attraverso
la chiave esterna: queste regole servono per rendere valide le associazioni tra le tabelle e
per eliminare gli errori di inserimento, cancellazione o modifica di dati collegati tra loro.
L’integrità referenziale richiede che per ogni valore non nullo della chiave esterna, esista un
valore corrispondente della chiave primaria nella tabella associata.
Per esempio, nel database relazionale formato dalle tabelle Studenti e Scuole il codice della
scuola della tabella Studenti è associato alla chiave primaria della tabella Scuole.
Scuole (Codice, NomeScuola)
Studenti (Matricola, Cognome, Nome, DataNascita, CodScuola)
Applicare l’integrità referenziale al database significa garantire che un valore presente nella
tabella Studenti per la chiave esterna CodScuola abbia un corrispondente valore di Codice in
una delle righe della tabella Scuole. Bisogna inoltre impedire la cancellazione di una scuola
dalla tabella Scuole se ci sono righe nella tabella Studenti che si riferiscono ad essa.
L’integrità referenziale, se applicata, non permette che si presentino situazioni come quella
dello studente Bruni che è associato ad una scuola inesistente, di cancellare la riga relativa alla
scuola di codice 125 per la presenza di studenti collegati, oppure di modificare il valore della
chiave del liceo Dante per la medesima ragione.
Si osservi che la presenza di un valore nullo per CodScuola, come nel caso dello studente
Verdi, non rappresenta una violazione all’integrità referenziale. L’integrità referenziale si limita
infatti a richiedere che, se c’è un valore nella chiave esterna CodScuola, esso debba anche
comparire in Codice di Scuole.
174
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
La mancanza di un valore in CodScuola può essere un fatto non desiderato ma per nulla strano:
significa semplicemente che non si conosce la scuola alla quale è iscritto un dato studente.
Volendo evitare questa situazione bisogna richiedere che in CodScuola venga obbligatoriamente immesso un valore. A questo punto, se sono stati imposti i vincoli di integrità referenziale,
in CodScuola ci deve essere un valore che compare anche nel campo Codice della tabella
Scuole.
In generale, data la Relazione1 avente come chiave l’attributo K1 e la Relazione2 con chiave
esterna FK1 associata a K1, le regole dell’integrità referenziale impongono che:
Ogni valore di FK1 deve avere un valore uguale di K1 in una delle righe di Relazione1
oppure, in alternativa, il valore di FK1 è nullo.
Ogni valore non
nullo di FK1 deve
comparire in K1
Relazione2
Relazione1
Chiave
B1
B2
FK1
K1
A1
A2
A3
A4
———
———
———
xxxx
xxxx
——
——
——
——
———
———
———
xxxx
xxxx
——
——
——
——
———
———
———
xxxx
xxxx
——
——
——
——
———
———
———
xxxx
xxxx
——
——
——
——
———
———
———
xxxx
xxxx
——
——
——
——
———
———
———
NULL
xxxx
——
——
——
——
———
———
———
xxxx
L’applicazione dell’integrità referenziale richiede che siano fatte rispettare le seguenti regole:
• non è possibile immettere un valore nella chiave esterna della tabella associata, se tale
valore non esiste tra le chiavi della tabella primaria. È possibile, comunque, immettere un
valore nullo nella chiave esterna, per rappresentare il fatto che le righe non sono correlate.
• non è possibile eliminare una n-upla dalla tabella primaria, se esistono righe legate ad essa
attraverso la chiave esterna nella tabella correlata.
• inoltre non si può modificare, come è ovvio, il valore alla chiave nella tabella primaria, se ad
essa corrispondono righe nella tabella correlata.
8 Osservazioni sul modello relazionale
Come si è potuto notare, il modello relazionale è molto intuitivo ed espressivo per la strutturazione
dei dati.
La teoria dei database relazionali è costruita a partire da sicuri fondamenti matematici e utilizza
un linguaggio rigoroso: questo consente di sviluppare definizioni, teoremi e dimostrazioni.
Dal punto di vista informatico presenta una grande semplicità nell’uso e nell’implementazione,
anche se è relativamente più lento nella ricerca e occupa più spazio su memoria di massa
rispetto ai database creati e gestiti da DBMS basati su altri modelli.
Il trattamento dei dati avviene per gruppi di record, anziché per singoli record, come avviene
nelle organizzazioni convenzionali degli archivi.
Il ritrovamento delle informazioni è realizzato operando sulle righe e sulle colonne delle tabelle,
con gli operatori di selezione, proiezione e congiunzione.
© Istituto Italiano Edizioni Atlas
175
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Le operazioni sulle relazioni producono nuove relazioni, alle quali si possono ulteriormente
applicare gli operatori. Quindi non è necessario specificare la sequenza del percorso che deve
essere seguito per accedere ai dati contenuti nel database, mentre le organizzazioni tradizionali degli archivi (sequenziale o diretta) sono strettamente condizionate dal tipo di cammino
insito nella struttura dei dati.
Nello schema tabellare del modello relazionale inoltre l’ordine con il quale le righe compaiono
nella tabella è ininfluente.
Il modello relazionale ha portato poi benefici nel lavoro di progettazione del database: il
progettista del database può costruire il modello dei dati considerando con attenzione le entità,
le associazioni e le dipendenze tra gli attributi nel modello della realtà. Il passaggio dal modello
concettuale al modello logico può essere realizzato con semplici regole.
Nel discutere la normalizzazione si è considerato l’esempio della tabella Dipendenti di schema:
Dipendenti (Matricola, Cognome, Nome, CodReparto, NomeReparto, CodiceCittà, NomeCittà)
Per effetto della normalizzazione lo schema Dipendenti viene scomposto nei 3 schemi di relazione:
Reparti (CodReparto, Nome Reparto)
Città (CodiceCittà, NomeCittà)
Dipendenti (Matricola, Cognome, Nome, CodReparto, CodiceCittà)
L’esempio è utile per comprendere come la normalizzazione sia riuscita a rilevare un originario
errore nella progettazione della tabella Dipendenti. Si noti infatti che nella versione non normalizzata la relazione Dipendenti contiene informazioni che provengono da diverse entità: oltre
alle informazioni che riguardano i dipendenti, ci sono anche informazioni che descrivono i
reparti nei quali essi lavorano e delle città dove sono collocati i reparti. La normalizzazione è
riuscita a separare queste informazioni in differenti tabelle ognuna delle quali descrive una sola
entità.
La normalizzazione può essere considerata il passo finale del processo complessivo di
progettazione della base di dati e può consentire di attuare un controllo sul modello
realizzato attraverso alcune precise regole.
Si osservi che la normalizzazione risulta particolarmente importante anche per controllare la
consistenza dei dati di un database già esistente, oppure nel caso di importazione di dati
all’interno di un database a partire da fonti di dati esterne (quali banche dati, file di testo o fogli
elettronici in formato CSV, ma anche tabelle di database creati con software DBMS diversi).
AUTOVERIFICA
Domande da 26 a 32 pag. 181-182
Problemi da 16 a 20 pag. 185
176
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
DOMANDE
Derivazione delle relazioni
Quali delle seguenti frasi esprime meglio la definizione di relazione di grado 2?
a) una tabella bidimensionale
b) un sottoinsieme di un qualsiasi insieme
c) una tabella con due colonne
d) una tabella con due righe
2
Se il dominio dell’attributo A1 è formato da un insieme di 5 oggetti e quello dell’attributo
A2 ne contiene 3, che cosa si può dire in merito alla cardinalità di una relazione con attributi
A1 e A2?
a) la cardinalità è 25
b) la cardinalità è minore o uguale a 15
c) la cardinalità è minore di 15
d) la cardinalità è minore o uguale a 8
3
Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
a) La relazione rappresenta un’associazione tra tabelle
b) Ogni n-upla rappresenta un’istanza dell’entità
c) Le colonne contengono i valori assunti dagli attributi dell’entità
d) Il dominio è l’insieme dei valori che possono essere assunti da una chiave
V
V
V
V
F
F
F
F
4
Associa a ciascun termine della colonna di sinistra la definizione corretta tra quelle elencate
a destra:
a) Grado
1) Insieme di n-uple
b) Dominio
2) Riga di una tabella
c) Relazione
3) Attributo che identifica una n-upla
d) Tupla
4) Insieme dei valori assunti da un attributo
e) Chiave
5) Numero delle colonne della tabella
5
Quali delle seguenti frasi esprimono la definizione di chiave di una relazione?
a) un attributo o un insieme di attributi che permettono di distinguere tra le righe della
relazione
b) un attributo numerico
c) un attributo senza valori duplicati
d) un attributo non derivato da altri
6
Per ciascuno degli oggetti elencati a sinistra riferiti a una tabella con i dati sulle prove degli
studenti, specifica se si tratta di una tabella (T), di un campo (C), di una chiave primaria (K),
indicando a destra la lettera corretta.
Oggetto
Tipo (T, C, K)
a) Voto
................................................................................
b) Identificativo della prova
................................................................................
c) Data della prova
................................................................................
d) Prove
................................................................................
© Istituto Italiano Edizioni Atlas
ATTIVITÀ DI AUTOVERIFICA
1
177
parte prima
Progettazione della base di dati
7
ATTIVITÀ DI AUTOVERIFICA
8
9
capitolo 4
Modello relazionale
Quali delle seguenti affermazioni su una tabella sono vere (V) e quali false (F)?
a) Gli attributi rappresentano informazioni elementari
b) Una relazione può avere righe duplicate
c) La presenza di una chiave primaria garantisce l’assenza di righe duplicate
d) Il numero di attributi deve essere identico per tutte le righe di una relazione
Quali delle seguenti affermazioni vere (V) e quali sono false (F)?
a) Per rappresentare un’associazione 1: N si aggiunge la chiave dell’entità che sta
dalla parte N agli attributi dell’entità che sta dalla parte 1
b) Per rappresentare un’associazione 1: N si aggiunge la chiave dell’entità che sta
dalla parte 1 agli attributi dell’entità che sta dalla parte N
c) Un’associazione N:N non è rappresentabile nel modello relazionale e si sostituisce
con due associazioni 1:N
d) Un’associazione N:N si rappresenta aggiungendo la chiave della prima entità agli
attributi della seconda entità e viceversa
V F
V F
V F
V F
V F
V F
V F
V F
Un’associazione (1:N) tra due entità E1 ed E2, dalle quali derivano le tabelle:
T1 (K1, A, B, C) e, rispettivamente, T2 (K2, D)
viene tradotta nel modello relazionale con:
a) T1 (K1, A, B, C);
T2 (K2, D);
T3(K1,K2)
b) T1 (K1, A, B, C, K2);
T2 (K2, D);
c) T1 (K1, A, B, C);
T2 (K2, D, K1);
d) T1 (K1, A, B, C, K2);
T2 (K2, D, K1);
10 Un’associazione (1:N) tra due entità E1 ed E2, dalle quali derivano le tabelle:
ha
a)
b)
c)
d)
T1 (K1, A, B, C) e, rispettivamente, T2 (K2, D)
attributi A1 e A2. Come viene tradotta nel modello relazionale?
T1 (K1, A, B, C);
T2 (K2, D);
T3 (K1, K2, A1, A2)
T1 (K1, A, B, C, K2);
T2 (K2, D, K1, A1, A2);
T1 (K1, A, B, C, A1, A2); T2 (K2, D, K1);
T1 (K1, A, B, C);
T2 (K2, D, K1, A1, A2);
11 Un’associazione (N:N) tra due entità E1 ed E2, dalle quali derivano le tabelle:
T1 (K1, A, B, C) e, rispettivamente, T2 (K2, D)
viene rappresentata nel modello relazionale con:
a) T1 (K1, A, B, C);
T2 (K2, D);
b) T1 (K1, A, B, C, K2);
T2 (K2, D, K1);
c) T1 (K1, A, B, C);
T2 (K2, D, K1);
d) T1 (K1, A, B, C, K2);
T2 (K2, D);
T3 (K1, K2)
12 Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
178
a) Un’associazione 1:1 si rappresenta sempre aggregando in un’unica tabella gli
attributi delle entità associate
V F
b) Un’associazione 1:1 si rappresenta spesso aggregando in un’unica tabella gli
attributi delle entità associate
V F
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
c) Un’associazione 1:1 con partecipazione facoltativa di un’entità si rappresenta
aggiungendo agli attributi dell’entità con partecipazione obbligatoria la chiave
dell’entità con partecipazione facoltativa
d) Un’associazione 1:1 con partecipazione facoltativa di un’entità si rappresenta
aggiungendo agli attributi dell’entità con partecipazione facoltativa la chiave
dell’entità con partecipazione obbligatoria
V F
V F
13 Un’associazione 1:1 tra due entità E1 ed E2, dalle quali derivano le tabelle:
ATTIVITÀ DI AUTOVERIFICA
T1 (K1, A, B, C) e, rispettivamente, T2 (K2, D)
con partecipazione facoltativa di E1 e obbligatoria di E2, viene tradotta nel modello relazionale
con:
a) T (K1, K2, A, B, C, D)
b) T1 (K1, A, B, C);
T2 (K2, D);
T3 (K1,K2)
c) T1 (K1, A, B, C);
T2 (K2, D, K1);
d) T1 (K1, A, B, C, K2);
T2 (K2, D);
Operazioni relazionali
14 Quali delle seguenti affermazioni sono vere (V) e quali sono false (F)?
a)
b)
c)
d)
Una proiezione non può alterare la cardinalità di una relazione
Nella maggior parte dei casi una proiezione non altera la cardinalità di una relazione
La selezione non cambia il grado di una relazione
La selezione non cambia mai la cardinalità di una relazione
15 Le relazioni R e S hanno schema: R (A, B, C) e S (C, D, E). Qual è lo schema di R
a)
b)
c)
d)
T
T
T
T
V
V
V
V
F
F
F
F
S?
(S.C, D, E)
(A, B, R.C, S.C, D, E)
(A, B, C, D, E)
(A, B, R.C)
16 Data la tabella anagrafica A (Codice, Cognome, Città), per ottenere l’elenco delle anagrafiche
dei soggetti che risiedono a Genova, bisogna eseguire l’interrogazione:
a) Proiezione di A su Città
b) Proiezione di A su Codice
c) Selezione di A per Cognome
d) Selezione di A per Città = “Genova”
17 Le relazioni R e S hanno schema: R (A, B, C) e S (C, D, E). Qual è lo schema di R left join S?
a)
b)
c)
d)
T
T
T
T
(R.C, D, E)
(A, B, R.C, S.C, D, E)
(A, B, R.C, D, E)
(A, B, R.C)
18 Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
a) Il join naturale non è altro che un left join seguito da un’opportuna proiezione
b) Il left join tra due tabelle produce una tabella che include tutte le righe presenti
nel join naturale tra le due tabelle
c) Il full join di R e S contiene tutte le righe presenti nel left join tra R e S e quelle
generate dal right join tra R e S
d) Le righe in comune tra il rigth join e il left join tra due tabelle sono quelle del join
naturale tra le tabelle
© Istituto Italiano Edizioni Atlas
V F
V F
V F
V F
179
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
Nelle domande successive si fa riferimento alle tabelle A, M di schema:
A (Codice, Cognome, Città)
M (Numero, Importo, Causale, Data, Codice)
dove A e M rappresentano, in forma molto semplificata, un’anagrafica di soggetti e i
movimenti contabili ad essi collegati.
19 Per ottenere numero e importo dei movimenti di “Bianchi” si deve eseguire l’interrogazione:
ATTIVITÀ DI AUTOVERIFICA
a) Proiezione di A su Cognome
Selezione del risultato per Cognome=”Bianchi”
Congiunzione del risultato con M su Codice
b) Selezione di A per Cognome=”Bianchi”
Congiunzione del risultato con M su Codice
Proiezione del risultato su Numero, Importo
c) Congiunzione di A e M su Codice
Proiezione del risultato su Numero, Importo
Selezione del risultato per Cognome=”Bianchi”
d) Selezione di A per Cognome = “Bianchi”
Proiezione del risultato su Numero, Importo
Congiunzione del risultato con M su Codice
20 Per ottenere causale e importo dei movimenti di importo maggiore di 5000 si deve eseguire
l’interrogazione:
a) Selezione di M per Importo > 5000
Proiezione del risultato su Causale, Importo
b) Selezione di A per Importo > 5000
Congiunzione del risultato con M su Codice
Proiezione del risultato su Causale, Importo
c) Congiunzione di A e M su Codice
Proiezione del risultato su Causale, Importo
d) Selezione di M per Importo > 5000
Congiunzione del risultato con M su Codice
Proiezione del risultato su Numero, Importo
21 Per ottenere l’elenco dei soggetti (con codice e cognome) che hanno effettuato movimenti
con causale “Vers” di importo superiore a 5000, si deve eseguire l’interrogazione:
a) Proiezione di A su Codice, Cognome
Congiunzione del risultato con M su Codice
Selezione del risultato per Causale = “Vers” e Importo > 5000
b) Proiezione di A su Codice, Cognome
Selezione di M per Causale = “Vers” e Importo > 5000
Congiunzione dei risultati su Codice
c) Selezione di M per Causale = “Vers” e Importo > 5000
Proiezione di A su Codice, Cognome
Congiunzione dei risultati su Codice
d) Selezione di M per Causale = “Vers” e Importo > 5000
Congiunzione del risultato con A su Codice
Proiezione del risultato su Codice, Cognome
180
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
22 L’interrogazione:
Selezione di A per Cognome = “Rossi”
Congiunzione del risultato con M su Codice
Proiezione del risultato su Importo, Causale
permette di ottenere:
a) l’elenco dei movimenti di Rossi
b) l’elenco dei movimenti di Rossi con Codice, Importo e Causale
c) l’elenco dei movimenti di Rossi con Importo e Causale
d) l’elenco dei movimenti di Rossi con tutti i campi
23 L’interrogazione:
ATTIVITÀ DI AUTOVERIFICA
Selezione di A per Città = “Pescara”
Proiezione del risultato su Codice, Cognome
permette di ottenere:
a) l’elenco delle anagrafiche di Pescara con tutti i campi
b) l’elenco delle anagrafiche di Pescara con Cognome, Codice e Città
c) l’elenco delle anagrafiche di Pescara con Codice e Città
d) l’elenco delle anagrafiche di Pescara con Codice e Cognome
24 L’interrogazione:
Selezione di A per Cognome = “Bianchi”
Selezione di M per Causale = “Prel”
Congiunzione dei risultati su Codice
permette di ottenere:
a) l’elenco dei prelievi di Bianchi con tutti i campi
b) l’elenco dei prelievi di Bianchi con Cognome e tutti i campi di M
c) L’elenco dei movimenti di Bianchi con tutti i campi
d) L’elenco dei prelievi di Bianchi con tutti i campi di A
25 L’interrogazione:
Congiunzione di A e M su Codice
Proiezione del risultato su Codice, Cognome
permette di ottenere:
a) l’elenco di tutti i movimenti
b) l’elenco delle anagrafiche che hanno effettuato movimenti
c) l’elenco di tutte le anagrafiche
d) l’elenco delle anagrafiche che hanno effettuato movimenti, con Codice, Cognome
Normalizzazione delle relazioni e integrità referenziale
26 Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
a) La normalizzazione delle relazioni ha lo scopo di prevenire la ridondanza
b) Le anomalie di aggiornamento, cancellazione, inserimento sono effetti indesiderati
della normalizzazione
c) La normalizzazione non garantisce la conservazione dell’informazione
d) La normalizzazione è una tecnica alternativa alla progettazione concettuale
V F
V F
V F
V F
27 Quale delle seguenti affermazioni esprime meglio la definizione di chiave primaria di una
relazione?
a) un insieme di attributi che permette di identificare in modo univoco una riga della tabella
b) la chiave candidata formata dal minor numero di attributi
c) una chiave formata da un solo attributo
d) un attributo prescelto dal progettista del database
© Istituto Italiano Edizioni Atlas
181
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
28 Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
a) Una chiave è determinante per ogni attributo della relazione
b) Un insieme di attributi determinante per ogni attributo della relazione è una
chiave candidata
c) Un attributo determinante per ogni attributo della relazione è una chiave candidata
d) Un insieme di attributi è determinante di ogni attributo che compone l’insieme
V F
V F
V F
V F
29 Quale tra le seguenti frasi esprime meglio il significato di terza forma normale di una relazione?
a)
b)
c)
d)
la forma normale che elimina la dipendenza transitiva degli attributi dalla chiave
una relazione in 2FN che elimina la dipendenza transitiva degli attributi dalla chiave
una relazione che rispetta i requisiti fondamentali del modello relazionale
la forma normale che elimina la dipendenza parziale degli attributi dalla chiave
30 L’attributo Codice è la chiave di Anagrafica ed è presente come chiave esterna in Movimenti.
ATTIVITÀ DI AUTOVERIFICA
Se tra le due tabelle sono stati imposti vincoli di integrità referenziale, quali delle seguenti
affermazioni sono vere (V) e quali false (F)?
a) Non è possibile inserire una riga di Movimenti con un valore di Codice che non
sia presente tra i valori di Codice in Anagrafica
V F
b) Non è possibile inserire una riga di Anagrafica con un valore di Codice che non
sia presente in Movimenti come chiave esterna
V F
c) Non è possibile inserire una riga di Movimenti senza immettere alcun valore per
Codice
V F
d) Non è possibile modificare il valore di un qualsiasi attributo di Anagrafica
V F
31 L’attributo Codice è la chiave di Anagrafica ed è presente come chiave esterna in Movimenti.
Se tra le due tabelle sono stati imposti vincoli di integrità referenziale, quali delle seguenti
affermazioni sono vere (V) e quali false (F)?
a) Non è possibile cancellare una riga di Movimenti
V F
b) Non è possibile modificare il valore di Codice in una riga di Movimenti
V F
c) È possibile cancellare una riga di Anagrafica a condizione che il valore di Codice
non sia presente in nessuna riga di Movimenti
V F
d) È possibile cambiare il valore di Codice in una riga di Anagrafica sotto opportune
condizioni
V F
32 Quale tra le seguenti frasi esprime meglio il significato di integrità?
a) garantire che le operazioni effettuate sul database da utenti autorizzati non provochino
una perdita di consistenza ai dati
b) impedire che il database venga danneggiato da interventi accidentali o non autorizzati
c) i dati contenuti nel database devono essere effettivamente utilizzabili in altri database
d) gli stessi dati non compaiono più volte in archivi diversi, cioè il database è costituito da
archivi integrati di dati
PROBLEMI
Derivazione delle relazioni
1
182
Dato il seguente schema di database:
Reparti (CodReparto, NomeReparto)
Prodotti (CodProdotto, Descrizione, Prezzo, CodReparto)
Vendite (Numero, Data, Quantità, CodProdotto)
costruire il modello E/R dei dati che ha originato le tre tabelle Reparti, Prodotti, Vendite.
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
2
Si considerino gli studenti di una scuola e le loro provenienze geografiche. Tra l’entità
Comune e l’entità Studente esiste un’associazione 1:N, perché molti studenti provengono
dallo stesso comune. Costruire il modello E/R e derivare le corrispondenti relazioni.
3
Un centro di formazione offre diversi corsi. Le persone possono iscriversi anche a diversi corsi.
Tra l’entità Corso e l’entità Iscritto esiste quindi un’associazione N:N. Costruire il modello E/R
e derivare le corrispondenti relazioni.
4
Si consideri l’associazione ricorsiva EssereMadre sull’entità Persona. Costruire il modello E/R
e derivare le corrispondenti tabelle.
5
Si consideri l’associazione ricorsiva EssereGenitore sull’entità Persona. Costruire il modello E/R
e derivare le corrispondenti tabelle.
ATTIVITÀ DI AUTOVERIFICA
Operazioni relazionali
6
Dopo aver definito il modello di database con una tabella per i dati delle aziende produttrici
e una tabella contenente i dati su modelli diversi di computer (associazione uno a molti),
fornire un esempio di selezione, uno di proiezione e uno di congiunzione sulle tabelle.
7
Dopo aver definito il modello di database con una tabella per i dati sui gruppi musicali e una
tabella contenente i dati sulle canzoni (associazione uno a molti), fornire un esempio di
selezione, uno di proiezione e uno di congiunzione sulle tabelle.
8
Dato il seguente schema di database:
Reparti (CodReparto, NomeReparto)
Prodotti (CodProdotto, Descrizione, Prezzo, CodReparto)
costruire le interrogazioni per ottenere:
- Codice e nome dei reparti nei quali non ci sono prodotti
- Codice e descrizione dei prodotti che hanno un CodReparto inesistente.
9
Dopo aver definito il modello di database con una tabella per i clienti di un’agenzia di
assicurazioni e una tabella con i dati relativi ai veicoli assicurati (associazione uno a molti),
determinare le operazioni relazionali necessarie per ottenere:
- Cognome, nome e indirizzo di tutti i clienti
- Targa e modello per i veicoli con valore assicurato superiore a una cifra prefissata
- Cognome, nome dei clienti e modello del veicolo assicurato
- Cognome, nome e telefono dei clienti di una provincia prefissata.
10 Dato il seguente schema di database:
Reparti (CodReparto, NomeReparto)
Prodotti (CodProdotto, Descrizione, Prezzo, CodReparto)
Vendite (Numero, Data, Quantità, CodProdotto)
costruire le interrogazioni per ottenere:
- l’elenco dei prodotti (con Descrizione e Prezzo) venduti in febbraio nel reparto “Alimenti
Surgelati”
- l’elenco dei prodotti (con Descrizione e Prezzo) del reparto “Cibo per Cani”
- l’elenco dei prodotti (con Descrizione e NomeReparto) che hanno originato vendite con
quantità venduta > 10 (quantità venduta in una singola vendita)
© Istituto Italiano Edizioni Atlas
183
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
11 Dato il seguente schema di database:
Stanze
Chirurghi
Pazienti
(Numero, Telefono, Televisore, AriaCond)
(Codice, Cognome, Nome, Specialità)
(Codice, Cognome, Nome, Indirizzo, CodiceChirurgo, DataIntervento,
OraIntervento, SalaOperatoria, NumeroStanza, InizioRicovero, FineRicovero)
costruire le interrogazioni per rispondere alle seguenti richieste:
- data di ricovero, stanza, data dell’intervento e nome del chirurgo che ha operato un
paziente di cui si conoscono nome e cognome
- elenco dei pazienti (con nome, cognome e indirizzo) operati da un dato chirurgo nel corso
del mese di marzo
- elenco dei pazienti (con nome, cognome e indirizzo) ricoverati nel secondo trimestre che
sono stati operati da un qualsiasi chirurgo di una data specialità.
ATTIVITÀ DI AUTOVERIFICA
Dopo aver svolto l’analisi del problema, si costruisca la base di dati a partire dal modello
E/R con la definizione delle tabelle e delle caratteristiche degli attributi; definire la procedura per la gestione dei dati; rappresentare poi le interrogazioni proposte con un linguaggio di pseudocodifica, individuando le operazioni relazionali.
Utilizzare come riferimento lo svolgimento dei progetti presentati nel paragrafo 5.
12 In un database si vogliono organizzare le informazioni sulle prove sostenute dagli studenti
di una scuola nelle diverse materie e con i diversi docenti: si devono quindi conservare i dati
degli studenti, dei docenti, delle materie e delle prove in modo da rendere possibili le
seguenti interrogazioni:
• l’elenco delle prove di uno studente;
• l’elenco delle prove effettuate da un docente in una classe;
• i voti di uno studente in una materia;
• i voti di una classe nella prova svolta in una materia in un determinato giorno;
• le date e il tipo delle prove effettuate da un docente in una materia;
• le date e il tipo di prove effettuate da un docente in una classe.
13 Organizzare le informazioni relative agli abbonamenti di una casa editrice che pubblica più
riviste: ogni rivista possiede molti abbonati e un abbonato può sottoscrivere più abbonamenti a riviste diverse. Dopo aver progettato il modello della base di dati, rappresentare le
seguenti interrogazioni:
• città di residenza degli abbonati a una rivista;
• titolo e prezzo dell’abbonamento di tutte le riviste;
• cognome e nome degli abbonati che hanno sottoscritto un abbonamento a una qualsiasi
delle riviste nel primo trimestre dell’anno in corso;
• titolo e periodicità della rivista con prezzo dell’abbonamento superiore a una cifra prefissata.
14 Le merci di una catena di supermercati sono distribuiti in magazzini di deposito; le entità
sono: prodotto, magazzino, acquisto. Con l’arrivo delle merci nei magazzini, vengono archiviati
gli acquisti di prodotti con il codice, la data e la quantità: ogni acquisto si riferisce a un solo
prodotto.
Definire il modello dei dati, ricavare le tabelle e rappresentare le seguenti interrogazioni:
• codice, descrizione, prezzo di acquisto dei prodotti di un determinato magazzino;
• codice dei prodotti di un determinato magazzino acquistati nella giornata odierna;
• data e quantità per gli acquisti dei prodotti aventi il prezzo di acquisto superiore a una cifra
prefissata;
• codice e descrizione dei prodotti per i quali si sono registrati acquisti con numero di pezzi,
per singolo acquisto, superiore a un numero prefissato;
• descrizione del prodotto e del magazzino per prezzo di acquisto del prodotto inferiore a
una cifra prefissata.
184
© Istituto Italiano Edizioni Atlas
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
15 Si vuole gestire con una base di dati il catalogo di un’azienda che vende programmi software
ATTIVITÀ DI AUTOVERIFICA
provenienti da diversi produttori. Ciascun produttore può fornire diversi prodotti software,
classificabili secondo alcune categorie principali; per esempio: sistemi operativi, linguaggi,
grafica, ambienti di sviluppo, Internet, ecc.
Nella progettazione di questo modello non teniamo conto della parte riguardante la registrazione di ordini o vendite, ma soltanto delle informazioni riguardanti i produttori e le caratteristiche dei prodotti (nome, versione, prezzo, lingua, ecc.). Per facilitare la gestione del
catalogo, anche le categorie sono organizzate con un codice e una descrizione.
Definire il modello dei dati, ricavare le tabelle e rappresentare le seguenti interrogazioni:
• nome e versione dei prodotti in una lingua prefissata;
• nome e prezzo dei programmi di un produttore prefissato del quale viene fornito il codice;
• denominazione e numero di telefono del produttore di un programma di cui viene fornito
il codice;
• elenco di tutti i software di una categoria prefissata (della quale viene fornito il codice),
con nome, versione, prezzo;
• elenco di tutti i software di un certo produttore avente una denominazione prefissata, con
nome, versione e lingua;
• elenco di tutti i software che costano meno di una cifra prefissata con denominazione del
produttore, indirizzo, nome del prodotto, versione e prezzo.
Normalizzazione delle relazioni e integrità referenziale
16 Le righe di una tabella contengono le informazioni anagrafiche di uno studente e i voti
conseguiti a fine anno in 9 materie. Normalizzare la tabella in modo da ottenere le tabelle
in prima forma normale, eliminando gli attributi ripetuti.
17 La tabella Anagrafica contiene informazioni sui dipendenti di un’azienda e ha il seguente
schema:
Anagrafica (Nome, Cognome, Matricola, Nascita, Indirizzo, CodiceDipartimento,
NomeDipartimento, IndirizzoDipartimento, Stipendio)
Definire le dipendenze funzionali che sussistono sullo schema di Anagrafica, individuare le
eventuali violazioni alla seconda e terza forma normale e scomporre la tabella in due o più
tabelle per eliminare le violazioni individuate.
18 La tabella Esami contiene informazioni sui risultati conseguiti dagli studenti negli esami e ha
uno dei due seguenti schemi:
Esami-1 (Corso, Matricola, Data, Voto, NomeCorso)
Esami-2 (Corso, Matricola, Data, VotoInCifre, VotoInLettere)
Definire, in entrambi i casi, le dipendenze funzionali che sussistono sullo schema della tabella
e individuare le eventuali violazioni alla seconda e terza forma normale.
19 Una tabella contiene per ogni riga il codice del libro, il nome dell’autore, il titolo del libro, il
nome dell’editore, l’indirizzo dell’editore, il prezzo e l’anno di edizione. Normalizzare la tabella
in modo da ottenere tabelle in terza forma normale che eliminino la dipendenza transitiva.
20 La tabella Materiali contiene informazioni sui materiali metallici di un magazzino e sui tipi
di acciaio utilizzati, e ha il seguente schema:
Materiali (Codice, Descrizione, Fornitore, Prezzo, IndirizzoFornitore, Quantità,
PosizioneInMagazzino, CodiceAcciaio, DescrizioneAcciaio, ResistenzaAcciaio,
NomeFornitore)
Definire le dipendenze funzionali che sussistono sullo schema di Materiali, individuare le
eventuali violazioni alla seconda e terza forma normale e scomporre la tabella in due o più
tabelle per eliminare le violazioni individuate.
© Istituto Italiano Edizioni Atlas
185
parte prima
Progettazione della base di dati
capitolo 4
Modello relazionale
SCHEDA DI AUTOVALUTAZIONE
CONOSCENZE
Concetti fondamentali del modello relazionale
Requisiti del modello relazionale
Regole di derivazione del modello logico
Derivazione delle associazioni uno a uno
Derivazione delle associazioni ricorsive
Operazioni relazionali: selezione, proiezione, join
Join esterno e self join
Interrogazioni con più operatori
Normalizzazione delle relazioni
Integrità referenziale
ABILITÀ
Dato un problema, costruire il modello E/R e derivare le tabelle
Derivare le tabelle da un’associazione ricorsiva
Fornire esempi di selezione, proiezione e congiunzione sulle tabelle
Date le tabelle, determinare le operazioni relazionali per eseguire le interrogazioni
Individuare le violazioni alle forme normali
Trasformare le tabelle in prima, seconda e terza forma normale
Applicare le regole pratiche di integrità referenziale nelle operazioni di manipolazione
DOMANDE PER LA PREPARAZIONE ALLA PROVA ORALE p. 532
SOLUZIONI AI QUESITI DI AUTOVERIFICA p. 536
186
© Istituto Italiano Edizioni Atlas
6
parte seconda
Ambienti software
per i database
Il linguaggio SQL
OBIETTIVI DI APPRENDIMENTO
In questo capitolo imparerai ad applicare correttamente
i principi del modello relazionale e a codificare nel
linguaggio SQL le operazioni relazionali.
Sarai in grado di interrogare il database usando il
linguaggio SQL per estrarre informazioni e controllare
la correttezza delle azioni programmate.
© Istituto Italiano Edizioni Atlas
Caratteristiche generali del
linguaggio SQL
Identificatori e tipi di dati
La definizione delle tabelle
I comandi per la
manipolazione dei dati
Il comando Select
Le operazioni relazionali nel
linguaggio SQL
Le funzioni di aggregazione
Ordinamenti e raggruppamenti
Le condizioni di ricerca
Interrogazioni nidificate
Le viste logiche
I comandi per la sicurezza
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
1 Introduzione
Nel primo capitolo si è osservato che, tramite i servizi di un DBMS, è possibile gestire gli
archivi di un sistema informativo con notevole efficienza, avendo a disposizione uno specifico
linguaggio per:
• definire e creare il database;
• effettuare le diverse operazioni di gestione dei dati, quali l’inserimento, la cancellazione e la
variazione dei record di un archivio;
• interrogare il database a scopo informativo.
Il linguaggio deve permettere di fare tutto questo facilmente ed essere basato su costrutti
semplici e facili da imparare. Le sue caratteristiche, infine, devono essere standardizzate in
modo che un utente, cambiando DBMS, non debba apprendere un nuovo linguaggio per usare
la base di dati.
Il linguaggio SQL (Structured Query Language) è nato con l’intento di soddisfare a queste
richieste nei database relazionali. Le interrogazioni che si possono costruire con SQL sono
un’estensione di quelle che si possono realizzare con sequenze di operazioni relazionali, in
quanto con SQL è possibile, come nelle query di Access, effettuare calcoli, raggruppamenti e
ordinamenti.
Access permette di costruire una query in modalità QBE e di visualizzare il corrispondente
codice in SQL. È anche possibile costruire l’interrogazione in SQL e, passando alla Visualizzazione
Struttura, visualizzare la versione QBE della query.
Per imparare il linguaggio è molto utile passare da una modalità all’altra e osservare come una
frase di SQL viene rappresentata in QBE oppure come una query QBE, di cui si conoscono
gli effetti, viene tradotta in SQL.
La conoscenza di SQL è di grande importanza anche nello sviluppo di applicazioni direttamente con Access in modalità QBE per le seguenti ragioni:
- ci sono interrogazioni che non si riescono a sviluppare nella sola modalità QBE di Access;
- per scrivere le interrogazioni nidificate, di cui si parlerà nei prossimi paragrafi, in modalità
QBE bisogna inserire un comando SQL nella riga dei criteri;
- volendo inserire in una maschera una casella combinata che permetta la scelta da un elenco
di dati estratti da una tabella, bisogna scrivere un’interrogazione SQL da inserire tra le
proprietà della casella;
- scritta un’interrogazione in modalità QBE e dovendola modificare, è spesso più facile e
rapido modificare il codice SQL dell’interrogazione che la versione QBE originale.
Nel seguito della presentazione del linguaggio SQL faremo riferimento al seguente esempio.
PROGETTO 1
Un’azienda è articolata in un certo numero di dipartimenti. I dipendenti sono assegnati ai diversi dipartimenti che hanno a capo un manager responsabile della gestione.
Le entità individuate sono:
• Impiegato con le informazioni sui dipendenti: il codice identificativo, nome, cognome,
residenza e stipendio;
• Dipartimento con le informazioni sui dipartimenti: il codice, il nome del dipartimento e
il suo indirizzo.
Tra Impiegato e Dipartimento si individuano due associazioni.
250
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
La prima è l’associazione Comprendere che è un’associazione uno a molti tra Dipartimento
e Impiegato perché un impiegato è compreso in un solo dipartimento, mentre un dipartimento è composto da molti impiegati. La partecipazione all’associazione è obbligatoria per
Impiegato e facoltativa per Dipartimento, nell’ipotesi che ci possano essere dipartimenti
ai quali non sono ancora stati assegnati dipendenti.
La seconda associazione è Coordinare che mette in relazione un dipartimento con il
dipendente che lo dirige. Coordinare è un’associazione uno a molti perché, nell’azienda in
esame, un dipendente può essere a capo di più di un dipartimento, mentre un dipartimento
è diretto da un unico manager. In questa associazione la partecipazione di Impiegato è
facoltativa in quanto solo alcuni dipendenti sono manager, mentre la partecipazione di
Dipartimento è obbligatoria perché tutti i dipartimenti devono essere diretti da qualcuno.
Rappresentiamo l’analisi dei dati con il seguente diagramma E/R:
N
Comprendere 1
Impiegato
ID
{PK}
Nome
Cognome
Residenza
Stipendio
Dipartimento
1
Coordinare
N
Codice
{PK}
Descrizione
Sede
Verifichiamo il modello costruito con le regole di lettura, ottenendo le seguenti frasi:
Ogni impiegato deve essere compreso in un solo dipartimento; ogni dipartimento può
comprendere uno o più impiegati.
Ogni impiegato può coordinare uno o più dipartimenti; ogni dipartimento deve essere
coordinato da un solo impiegato.
Gli attributi di Impiegato sono: ID, Nome, Cognome, Residenza, Stipendio, con ID chiave
primaria dell’entità, mentre quelli di Dipartimento sono: Codice, Descrizione, Sede, con
Codice chiave primaria dell’entità. Il passaggio dal modello concettuale al modello relazionale
permette di definire le due associazioni con il seguente schema, nel quale l’attributo
sottolineato rappresenta la chiave primaria, mentre quello in corsivo è la chiave esterna
della relazione:
Impiegati (ID, Nome, Cognome, Residenza, Stipendio, Dipartimento)
Dipartimenti (Codice, Descrizione, Sede, Manager)
L’attributo Dipartimento di Impiegati contiene il codice del dipartimento di appartenenza di
un dipendente ed è stato introdotto per rappresentare l’associazione uno a molti tra
Dipartimento e Impiegato. Analogamente l’attributo Manager di Dipartimento rappresenta
l’associazione uno a molti tra Impiegato e Dipartimento e contiene il valore della chiave
primaria del dipendente che dirige il dipartimento.
Dalla figura nella pagina seguente, che mostra un esempio di dati delle due relazioni, si può
osservare che l’impiegato con ID = 6 lavora nel dipartimento Magazzino, che è diretto dal
dipendente con ID = 10, (Margherita Colombi). La quinta riga della relazione Dipartimenti
evidenzia che anche il dipartimento Produzione è diretto da Margherita Colombi.
Si noti anche l’impiegato con ID = 5 che non è assegnato ad alcun dipartimento. Questa
situazione, in violazione all’obbligatorietà della partecipazione di Dipendente all’associazione Comprendere, si può presentare per un dipendente appena assunto e non ancora
assegnato ad alcun dipartimento.
© Istituto Italiano Edizioni Atlas
251
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
2 Caratteristiche generali del linguaggio SQL
Il linguaggio SQL è un linguaggio non procedurale che è diventato uno standard tra i linguaggi
per la gestione di database relazionali.
Dopo una prima versione introdotta da IBM alla fine degli anni ’70 per un prototipo di ricerca
denominato System R, negli anni ’80 fu adottato con il nome attuale come linguaggio per i
software DBMS prodotti dalla IBM (DB2 e SQL/DS).
Nel 1986 l’ANSI (American National Standards Institute) pubblicò il primo standard del linguaggio SQL, al quale seguì lo standard dell’ISO (International Standards Organization) pubblicato
nel 1987. Successivamente le specifiche del linguaggio vennero precisate e ampliate: gli
aggiornamenti degli standard portarono alla versione, detta SQL2, pubblicata nel 1992 da ISO
(ISO 9075) e alla successiva, indicata come SQL3, pubblicata nel 1999 da ISO come ISO 9075-2.
Oggi il linguaggio SQL viene usato in tutti i prodotti DBMS come linguaggio di comandi per
l’utente della base di dati (ricordiamo Oracle, MySQL, SQLServer, Access).
Alcuni di questi prodotti, sviluppati originariamente per sistemi di elaborazione grandi e medi,
sono stati poi adattati con versioni per personal computer, con l’uso di SQL come linguaggio
relazionale.
Le diverse versioni del linguaggio SQL sono in genere aderenti agli standard internazionali, ma
ci sono sicuramente delle differenze che possono essere individuate attraverso la documentazione fornita con i prodotti software.
Spesso si possono trovare le istruzioni SQL inserite nei programmi scritti con i linguaggi di
programmazione tradizionali (linguaggi ospite), oppure il linguaggio SQL rappresenta uno degli
strumenti principali all’interno di ambienti di sviluppo software: in questi casi si parla di
Embedded SQL.
Le parole-chiave che costituiscono i comandi del linguaggio SQL possono essere usate in
modo interattivo, scrivendole direttamente sulla tastiera nel momento in cui si vogliono
attivare. Tuttavia in molti ambienti i comandi possono essere inviati al sistema attraverso
un’interfaccia grafica, che utilizza menu, finestre e icone per guidare l’utente nella costruzione
dell’istruzione SQL.
La terminologia del linguaggio SQL è analoga a quella di Access dove un database è costituito
da tabelle, che rappresentano le relazioni; gli attributi sono le colonne della tabella e i record
sono le righe della tabella.
Rispetto ai linguaggi di programmazione, il linguaggio SQL, per la semplicità nell’uso delle
istruzioni, la concisione dei comandi e la visione tabellare dei dati, può sicuramente aumentare
la produttività nel progetto e nello sviluppo delle applicazioni orientate alla gestione di archivi
di dati.
252
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Il linguaggio SQL consente all’utente di:
• definire la struttura delle relazioni del database e di controllare gli accessi al database
(funzioni di DDL),
• modificare i dati contenuti nel database, con le operazioni di inserimento, variazione e
cancellazione (funzioni di DML),
• porre interrogazioni al database (funzioni di Query Language).
Il linguaggio SQL fornisce inoltre gli opportuni comandi per definire in modo facile i tabulati di
uscita dei risultati (report), per recuperare i dati quando accade un’interruzione del programma,
un guasto nei supporti magnetici o un malfunzionamento del sistema, per definire le viste degli
utenti sul database, per garantire la sicurezza dei dati nei confronti degli accessi di più utenti.
3 Identificatori e tipi di dati
Il linguaggio SQL utilizza i caratteri alfabetici, le cifre decimali, gli operatori aritmetici e di
confronto (+ - / * = < >), più altri caratteri che assumono particolari significati nella sintassi
delle istruzioni e che verranno descritti nel seguito.
Gli identificatori (nomi di tabelle e di attributi) sono costituiti da sequenze di caratteri di
lunghezza massima uguale a 18 caratteri: devono iniziare con una lettera e possono anche
contenere il carattere _.
Il nome di un attributo, ovvero di una colonna di una tabella, è identificato per mezzo della
notazione abituale:
NomeTabella.NomeAttributo
nella quale il nome della tabella e il nome dell’attributo vengono separati da un punto. Il nome
della tabella può essere omesso se non ci sono ambiguità nell’identificazione dell’attributo.
Nella dichiarazione della struttura di una tabella occorre specificare il tipo dei dati scelto per gli
attributi.
I tipi standard del linguaggio SQL sono:
BOOLEAN
Valore logico
True, False
CHARACTER(n)
Stringa di lunghezza n
n da 1 a 15000
DATE
Data nella forma MM/GG/AA
TIME
Ora nella forma HH:MM
INTEGER(p)
Numero intero con precisione p
p da 1 a 45
SMALLINT
Numero intero con precisione 5
da -32768 a 32767
INTEGER
Numero intero con precisione 10
da -2.147.483.648
a 2.147.483.647
DECIMAL(p,s)
Numero decimale con precisione
p e s cifre decimali
p da 1 a 45 e s da 0 a p
REAL
Numero reale con mantissa
di precisione 7
valore 0 oppure valore
assoluto da 1E-38 a 1E+38
FLOAT (o DOUBLE
PRECISION)
Numero reale con mantissa
di precisione 15
valore 0 oppure valore
assoluto da 1E-308 a 1E+308
FLOAT(p)
Numero reale con mantissa
di precisione p
p da 1 a 45
Per i dati numerici la precisione p indica il numero massimo di cifre che il numero può
contenere, esclusi il segno e il punto decimale.
Per i numeri decimali il valore s indica il numero di cifre che seguono il punto decimale.
© Istituto Italiano Edizioni Atlas
253
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
I dati numerici floating point sono memorizzati in forma esponenziale; la precisione riguarda
solo le cifre della mantissa e indica il numero di cifre significative del dato.
La parola NUMERIC può essere usata al posto di DECIMAL.
La parola CHARACTER è equivalente a CHARACTER(1), e può essere abbreviata con CHAR.
DECIMAL è equivalente a DECIMAL(15,0).
Altre abbreviazioni sono:
• CHAR(n) invece di CHARACTER(n);
• INT(p) invece di INTEGER(p);
• DEC(p,s) invece di DECIMAL(p,s).
Occorre osservare che alcune versioni di SQL in specifici ambienti DBMS differiscono dallo
standard nell’indicazione dei tipi di dati. Le stesse considerazioni valgono anche per le successive istruzioni del linguaggio: in diverse versioni del linguaggio SQL ci possono essere varianti
nella sintassi e nei termini utilizzati. Per risolvere questi problemi è opportuno sempre controllare gli esempi presentati nei manuali per l’utente o nell’help in linea del linguaggio.
Le costanti stringa sono delimitate dai caratteri ' o ". Il delimitatore standard è l’apice '.
Nelle colonne della tabella gli attributi che hanno un valore non disponibile, o non definito,
assumono il valore Null. Il valore Null non è mai uguale a nessun altro valore: è diverso dal
valore zero per i dati numerici e dalla stringa vuota (") per i dati alfanumerici.
Negli ordinamenti il valore Null compare, di norma, all’inizio delle sequenze crescenti e alla fine
delle sequenze decrescenti.
Le costanti numeriche possono avere o non avere il segno + oppure –. Nei numeri decimali la
parte intera è separata dalle cifre decimali attraverso il punto. I numeri in floating point possono
essere rappresentati in forma esponenziale, per esempio –1.2E+7.
Nelle operazioni di confronto i numeri sono controllati in accordo con il loro valore algebrico,
mentre le stringhe sono confrontate carattere per carattere a partire da sinistra secondo il
codice ASCII. Nelle scrittura delle condizioni possono essere usati gli operatori NOT, AND e OR.
Tutti i risultati di confronti numerici o stringa che riguardano attributi con valore Null sono
considerati sconosciuti, perché Null non è uguale, maggiore o minore di nessun altro valore.
Il linguaggio SQL può solo controllare la presenza o l’assenza di Null in una colonna.
4 La definizione delle tabelle
Le tabelle vengono definite con il comando CREATE TABLE, seguito dal nome della tabella
e dall’elenco degli attributi. Per ogni attributo occorre specificare il nome e il tipo di dato. Gli
attributi possono essere qualificati mediante diverse clausole con le quali è possibile definire:
la chiave primaria, le chiavi esterne, l’obbligatorietà e il valore di default di un campo.
PROGETTO 2
Creare la tabella degli Impiegati e dei Dipartimenti.
Per creare la tabella Impiegati del database utilizzato in questo capitolo si deve usare il
seguente comando:
CREATE TABLE
ID
Nome
Cognome
Residenza
Stipendio
Dipartimento
254
Impiegati(
smallint primary key,
char(20) not null,
char(30) not null,
char(20) default '*** Manca Residenza',
decimal(9,2),
char(5) references Dipartimenti(Codice));
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
L’attributo ID è dichiarato chiave primaria della tabella tramite la clausola PRIMARY KEY.
La clausola NOT NULL indica che in tutte le righe della tabella quella colonna deve essere
riempita con un valore non nullo e rende il campo obbligatorio.
La clausola DEFAULT definisce il valore da attribuire al campo se, al momento della
creazione del record che lo contiene, non gli viene assegnato alcun valore.
La clausola REFERENCES indica che l’attributo Dipartimento è chiave esterna e definisce
un vincolo di integrità referenziale con la tabella Dipartimenti.
Tra le altre clausole ammesse va ricordata la clausola UNIQUE che vieta la presenza di
valori duplicati in una colonna o in un insieme di colonne. Per esempio, per indicare che non
ci possono essere due dipendenti con identico nome e cognome nello stesso dipartimento, si può sfruttare la clausola UNIQUE:
UNIQUE(Cognome, Nome, Dipartimento)
inserita nel comando CREATE TABLE, di seguito alla dichiarazione delle caratteristiche
dell’attributo Dipartimento, prima dei caratteri parentesi chiusa e punto e virgola ( ); ) che
chiudono la dichiarazione.
Anche le clausole PRIMARY KEY e REFERENCES possono essere inserite in righe
isolate; questa caratteristica permette di dichiarare chiavi primarie o chiavi esterne formate
da più campi. Assieme alla definizione di una chiave esterna è possibile dichiarare il tipo di
comportamento da tenere in caso di cancellazione di una riga nella tabella collegata o di
variazione del valore della chiave primaria associata alla chiave esterna.
Per esempio, per creare la tabella Dipartimenti si deve usare il seguente comando:
CREATE TABLE Dipartimenti(
Codice
char(5),
Descrizione char(20) not null,
Sede
char(20),
Manager
smallint,
Primary Key (Codice),
Unique (Descrizione),
Foreign Key (Manager) references Impiegati(ID)
On Delete set null
On Update cascade);
Osservando le ultime clausole del comando si può affermare che:
- Codice è chiave primaria della tabella (Primary Key);
- non ci possono essere due dipartimenti con lo stesso nome: Unique (Descrizione);
- è possibile dichiarare la chiave esterna in una riga a sé stante (Foreign Key);
- Manager è chiave esterna associata alla tabella Impiegati;
- la cancellazione di una riga di Impiegati con un valore di ID assunto in una o più righe di
Dipartimenti dal campo Manager è permessa e i valori di Manager corrispondenti assumono valore nullo (On Delete set null);
- l’aggiornamento di un ID associato a Manager si riflette a catena sui valori di Manager
(On Update cascade).
Per esempio, ricordando che Margherita Colombi (ID=10) è responsabile dei dipartimenti
Magazzino e Produzione, la cancellazione del record con ID=10 di Impiegati è ammesso
e nelle righe dei record descrittivi di Magazzino e Produzione in Dipartimenti il campo
Manager assumerà il valore Null; se a Margherita Colombi viene assegnato un nuovo
valore di ID esso viene attribuito al campo Manager nelle righe dei dipartimenti Magazzino
e Produzione.
© Istituto Italiano Edizioni Atlas
255
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Si osservi che le dichiarazioni: On Delete cascade e On Update cascade coincidono con
le scelte Elimina record correlati a catena e Aggiorna campi collegati a catena che possono
essere effettuate con Access nella definizione delle relazioni tra tabelle, come si è visto nel
capitolo 5.
Le dichiarazioni On Delete no action e On Update no action impediscono di cancellare
un record della tabella Impiegati correlato alla chiave esterna di Dipartimenti o di modificare
il valore della chiave primaria di un dipendente che è manager in qualche dipartimento. Se
nella clausola Foreign Key non appare la dichiarazione On Delete oppure On Update, il
comportamento del sistema per garantire l’integrità referenziale è del tipo no action.
La struttura di una tabella può essere modificata in un secondo tempo con il comando ALTER
TABLE, per aggiungere una nuova colonna (ADD) a quelle già esistenti, oppure per togliere
una colonna (DROP).
Per esempio, per inserire un nuovo attributo con la data di nascita del dipendente si usa il
comando:
ALTER TABLE Impiegati
ADD Nascita date;
Utilizzando l’opzione Drop si può togliere dalla tabella Impiegati l’attributo che si riferisce alla
località di residenza:
ALTER TABLE Impiegati
DROP Residenza;
L’istruzione CREATE INDEX viene utilizzata per creare un nuovo indice su una tabella esistente, indicando il nome della tabella e il nome dell’attributo o degli attributi ai quali associare
l’indice.
Se non si vuole che ci siano valori duplicati per l’attributo associato all’indice, occorre usare la
clausola UNIQUE.
Per esempio il comando seguente crea un indice di nome IndiceImpiegati sulla tabella Impiegati secondo gli attributi Cognome e Nome e non sono ammessi duplicati.
CREATE UNIQUE INDEX IndiceImpiegati
ON Impiegati(Cognome, Nome);
Una tabella o un indice possono essere eliminati con il comando DROP, seguito dal nome della
tabella o dell’indice. Per esempio, il seguente comando cancella la tabella Impiegati:
DROP TABLE Impiegati;
In modo analogo per cancellare l’indice di nome IndiceImpiegati si usa il comando:
DROP INDEX IndiceImpiegati ON Impiegati;
I comandi illustrati finora rappresentano la parte del linguaggio SQL che fa riferimento alla
categoria dei comandi definiti con la sigla DDL (Data Definition Language), cioè il linguaggio
che consente di implementare il modello logico dei dati sulle memorie di massa del computer.
Occorre osservare che nelle versioni moderne dei prodotti DBMS le operazioni di creazione di
tabelle e di indici, oltre che di modifica alla struttura della tabella o di cancellazione di tabelle
e indici, vengono effettuate, come in Access, attraverso un’interfaccia interattiva che facilita il
lavoro dell’utente, il quale può anche non conoscere la sintassi dei comandi sopra illustrati.
256
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
5 I comandi per la manipolazione dei dati
I valori degli attributi nelle righe della tabella possono essere inseriti, aggiornati o cancellati
rispettivamente con i comandi INSERT, UPDATE e DELETE.
Illustriamo l’uso di questi comandi con alcuni esempi.
PROGETTO 3
Effettuare operazioni di manipolazione sulla tabella Impiegati.
Per inserire i valori di una nuova riga della tabella Impiegati, si usa il comando:
INSERT INTO Impiegati
(ID, Nome, Cognome, Residenza, Stipendio, Dipartimento)
VALUES(20, 'Mario', 'Rossini', 'Caserta', 31500, 'Mag');
Per assegnare il dipendente con ID = 20, presente in anagrafica, al dipartimento Produzione, occorre dare il comando:
UPDATE Impiegati
SET Dipartimento = 'Prod'
WHERE Matricola = 20;
È possibile cambiare anche più attributi con un solo comando Update elencandone i nomi
e i nuovi valori dopo la parola Set, separati dalla virgola.
Per cancellare dalla tabella Impiegati i dati del dipendente con ID = 20, si usa il comando:
DELETE FROM Impiegati
WHERE ID = 20;
È molto importante notare che l’uso della clausola Where nei comandi Update e Delete
consente di operare su gruppi di record, cioè su molte righe, anziché su una sola riga per
volta: basta indicare dopo Where una condizione che deve essere verificata dalle righe che
si vogliono modificare o cancellare.
Per esempio, se si vuole aumentare del 5% lo stipendio di tutti i dipendenti del dipartimento Produzione, occorre dare il comando:
UPDATE Impiegati
SET Stipendio = Stipendio * 1.05
WHERE Dipartimento = 'Prod';
Per eliminare dalla tabella Impiegati le righe corrispondenti ai dipendenti del dipartimento
Ricerca & Sviluppo, si usa il seguente comando:
DELETE FROM Impiegati
WHERE Dipartimento = 'R&S';
Come già detto a proposito della creazione delle tabelle, nell’uso pratico del linguaggio, le
operazioni di inserimento, così come quelle di modifica e di cancellazione, vengono facilitate
mediante l’uso di maschere video che guidano l’utente nelle operazioni di trattamento dei dati,
all’interno di un ambiente software basato sull’uso di interfacce grafiche amichevoli.
© Istituto Italiano Edizioni Atlas
257
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Si pensi, nel caso di Access, all’uso delle maschere e alla possibilità di manipolare dati agendo
direttamente sulla Visualizzazione Foglio dati di una tabella.
Quindi i comandi di tipo DML (Data Manipulation Language) presenti all’interno del linguaggio
SQL rimangono nascosti all’utente che può effettuare le operazioni di manipolazione senza
conoscere la sintassi delle istruzioni.
AUTOVERIFICA
Domande da 1 a 2 pag. 294
Problemi 1, 2 pag. 296 e 40, 41 pag. 298
6 Il comando Select
La caratteristica più importante del linguaggio SQL è la sua capacità di estrarre le informazioni
desiderate dal database mediante interrogazioni. Queste funzionalità sono fornite dal comando SELECT che è semplice da usare e allo stesso tempo molto potente.
Il comando Select riflette la natura dichiarativa del linguaggio SQL, e le interrogazioni sulle
tabelle del database sono eseguite specificando solo cosa si vuole ottenere, senza doversi
preoccupare di problemi quali: le modalità di rappresentazione dei dati e i percorsi per ritrovarli
nelle memorie di massa.
La struttura base del comando Select è la seguente:
SELECT Colonne
FROM Tabelle
WHERE Condizioni
Accanto alla parola Select sono indicati i nomi degli attributi (le colonne) da elencare (se è
necessario elencare tutti gli attributi basta scrivere il segno di asterisco * dopo Select); nella
clausola From vengono indicati i nomi della tabella o delle tabelle usate nell’interrogazione;
dopo la clausola Where si specifica una condizione logica su uno o più attributi con lo scopo
di filtrare le righe delle tabelle.
La condizione logica è espressa secondo le modalità abituali dell’informatica, componendo
confronti con gli operatori AND, OR e NOT. Le forme ammesse da SQL per la scrittura di
condizioni sono approfondite nel paragrafo 10.
PROGETTO 4
Effettuare interrogazioni sulla tabella Impiegati.
L’elenco con cognome, nome e residenza dei dipendenti del dipartimento di codice Prod
si ottiene con il seguente comando:
SELECT Cognome, Nome, Residenza
FROM Impiegati
WHERE Dipartimento = 'Prod';
L’elenco dei dipendenti (con ID, Cognome, Nome) che lavorano alla produzione e risiedono
a Torino si ottiene con la seguente interrogazione:
SELECT ID, Cognome, Nome
FROM Impiegati
WHERE Dipartimento = 'Prod' AND Residenza = 'Torino';
258
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
In questi primi esempi accanto alla parola Select sono stati specificati solo alcuni fra gli
attributi della tabella. Per richiedere tutti i dati dei dipendenti che abitano a Roma, si usa
il comando Select nella forma:
SELECT *
FROM Impiegati
WHERE Residenza = 'Roma';
Nell’esempio il simbolo * sostituisce l’elencazione di tutti gli attributi della tabella Impiegati.
Il comando Select possiede i due predicati ALL e DISTINCT.
Con il predicato ALL si richiede che nel risultato dell’interrogazione siano incluse tutte le righe
che soddisfano alle condizioni contenute nel comando. Questo predicato è di default e quindi,
se non viene fatta nessuna specificazione, sono visualizzate tutte le righe, anche se duplicate,
della tabella prodotta dall’interrogazione.
Pertanto le due seguenti istruzioni Select sono equivalenti:
SELECT *
FROM Impiegati
WHERE Residenza = 'Milano';
SELECT ALL *
FROM Impiegati
WHERE Residenza = 'Milano';
Se viene specificato il predicato DISTINCT le righe duplicate nella tabella risultante sono
ridotte a una.
Per esempio, se si desidera ottenere l’elenco di tutte le località di residenza dei dipendenti, senza duplicati, anche se ci sono località, come
Torino, dove risiedono più dipendenti, si deve usare la clausola DISTINCT
prima dell’indicazione dell’attributo:
SELECT DISTINCT Residenza
FROM Impiegati;
Si ottiene così l’elenco nella colonna a sinistra. Il comando SELECT nella forma senza la clausola DISTINCT:
SELECT Residenza
FROM Impiegati;
produce invece l’elenco nella colonna a destra che, come si può notare, contiene righe
duplicate. Come si è anticipato nel Capitolo 4, i DBMS commerciali, per ragioni di efficienza,
non rispettano strettamente il modello relazionale che non ammette la presenza di righe
duplicate in una tabella.
Il predicato DISTINCT fa in modo che un comando Select produca una tabella coerente con
il modello relazionale dei dati. La presenza del predicato DISTINCT in un comando Select
impone che una riga sia inclusa nella tabella risultante solo se non c’è un’altra riga con gli stessi
valori.
La tabella che si ottiene come risultato dell’interrogazione ha di norma un’intestazione delle
colonne che riporta i nomi degli attributi; se si vuole modificare tale intestazione, occorre
rinominare la colonna usando la clausola AS.
© Istituto Italiano Edizioni Atlas
259
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Per esempio, se si vuole ottenere l’elenco degli impiegati con ID, Nome e Cognome, ma si
desidera che al posto di ID compaia Matricola come intestazione della colonna, si deve
scrivere il seguente comando:
SELECT ID AS Matricola, Nome, Cognome
FROM Impiegati;
Con il comando SELECT si può anche richiedere il calcolo di espressioni sugli attributi
presenti nella tabella; la tabella risultante contiene una colonna aggiuntiva con i risultati del
calcolo per ogni riga. Questa nuova colonna può essere intestata con una descrizione opportuna utilizzando la parola AS. In assenza di AS l’intestazione della colonna viene costruita dal
sistema in modo differente a seconda dell’implementazione.
Nel caso di Access il nome è Espr1 per la prima espressione, se compare una seconda
espressione questa viene indicata con Espr2, e così via. Per esempio il seguente comando
visualizza, accanto agli stipendi attuali, quali sarebbero i nuovi stipendi degli impiegati del
magazzino se fossero aumentati del 5%. Gli importi di Stipendio nella tabella, naturalmente,
non sono modificati.
SELECT Cognome, Nome, Stipendio AS Attuale, Stipendio*1.05 AS Nuovo
FROM Impiegati
WHERE Dipartimento = 'Mag';
Nella maggior parte degli esempi di questo capitolo per rendere più semplice la descrizione dei
comandi di SQL, vengono utilizzati valori costanti nelle condizioni scritte nella clausola Where,
come nel caso della seguente interrogazione:
SELECT Cognome, Nome, Residenza, Stipendio
FROM Impiegati
WHERE Stipendio >= 55000;
che elenca i dipendenti con una retribuzione annua di almeno 55000 euro. In realtà la retribuzione minima da utilizzare nell’operazione di confronto, anziché essere uguale alla costante
55000, potrebbe essere indicata in modo parametrico, per poter usare la stessa interrogazione
più volte, in diverse ricerche. Per esempio, nell’SQL di Access questo può essere fatto
indicando tra parentesi quadre un messaggio: al momento dell’esecuzione dell’interrogazione
all’utente viene richiesto di inserire, con una finestra di dialogo, il valore della retribuzione
minima da considerare nell’interrogazione.
SELECT Cognome, Nome, Residenza, Stipendio
FROM Impiegati
WHERE Stipendio >= [Retribuzione minima?];
260
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Come si è già osservato, il dipendente con ID = 5 non è assegnato ad alcun dipartimento.
Volendo ottenere l’elenco di tutti i dipendenti senza dipartimento di assegnazione, si devono
identificare le righe con valori nulli nel campo Dipartimento e, per farlo occorre usare l’interrogazione:
che genera l’elenco richiesto. Si osservi che per controllare la presenza di valori nulli si deve
fare uso del predicato IS NULL, mentre è errato ricercare tali valori con clausole del tipo usato
nella seguente query:
SELECT ID AS Matricola, Cognome, Nome
FROM Impiegati
WHERE Dipartimento = '';
Ricerca una stringa vuota in Dipartimento
Questa interrogazione produce un elenco vuoto perché non c’è nessuna riga di Impiegati nella
quale è stata immessa una stringa di caratteri vuota nel campo Dipartimento.
Per scrivere un’interrogazione in SQL nell’ambiente di Access, bisogna creare una nuova query
accedendo alla Visualizzazione Struttura, e chiudere la finestra di dialogo Mostra tabella senza
scegliere alcuna tabella. Poi si deve fare clic sulla scelta
che è diventata la proposta del
pulsante Visualizza. Appare una finestra come quella in figura che permette di scrivere l’interrogazione desiderata.
7 Le operazioni relazionali nel linguaggio SQL
Le operazioni di selezione, proiezione e congiunzione su una base di dati relazionale vengono
realizzate attraverso il comando Select, secondo le diverse forme consentite dalla sintassi di
questo comando. Se si vuole rispettare una delle regole del modello relazionale, che non
consente la presenza di righe uguali all’interno della stessa tabella, basta porre accanto alla
parola Select la clausola Distinct: con questa specificazione la tabella ottenuta non conterrà
righe duplicate.
La selezione e la proiezione sono già state utilizzate negli esempi di uso del comando Select
del precedente paragrafo.
L’operazione di selezione, che consente di ricavare da una relazione un’altra relazione contenente solo le righe che soddisfano a una certa condizione, viene realizzata nel linguaggio SQL
utilizzando la clausola Where del comando Select.
© Istituto Italiano Edizioni Atlas
261
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Per esempio, per ottenere l’elenco con tutti i dati dei dipendenti con stipendio minore di 31000
euro, si opera una selezione sulla tabella Impiegati, estraendo le righe per le quali l’attributo
Stipendio è minore di 31000. In pseudocodifica si scrive:
σP Impiegati
Selezione di Impiegati per Stipendio < 31000
La precedente interrogazione viene codificata in linguaggio SQL con il comando:
SELECT *
FROM Impiegati
WHERE Stipendio < 31000;
L’operazione di proiezione, che permette di ottenere una relazione contenente solo alcuni
attributi della relazione di partenza, si realizza scrivendo accanto alla parola Select l’elenco degli
attributi richiesti. Per esempio, per ottenere l’elenco di tutti i dipendenti con cognome, nome
e matricola, si deve effettuare una proiezione sulla tabella Impiegati estraendo soltanto le
colonne corrispondenti agli attributi richiesti. In pseudocodifica si scrive:
ΠL Impiegati
Proiezione di Impiegati su Cognome, Nome, ID
Questa operazione viene codificata in linguaggio SQL con il comando:
SELECT Cognome, Nome, ID
FROM Impiegati
Il comando Select può operare su più tabelle, indicandone i nomi (separati da virgola) dopo la
parola From e scrivendo, dopo la parola Where, la condizione che fa corrispondere le righe di
una tabella con quelle dell’altra.
Come si è detto nel precedente capitolo, nella quasi totalità dei casi si vogliono costruire degli
equi-join, per cui la condizione da scrivere nella clausola Where consiste nell’uguaglianza tra
attributi in due tabelle. Si realizza così l’operazione di congiunzione di due tabelle secondo un
attributo comune. Qualora ci sia l’esigenza di maggiore chiarezza nella descrizione del comando,
oppure ci siano due attributi con lo stesso nome in due tabelle diverse, è opportuno o necessario,
a seconda dei casi, indicare il nome della tabella e il nome dell’attributo separati dal punto.
Per ottenere l’elenco di tutti i dipendenti con i dati del dipartimento dove lavorano, occorre
effettuare la congiunzione delle tabelle Impiegati e Dipartimenti secondo gli attributi comuni
Dipartimento e Codice:
ImpiegatiFK
DipartimentiPK
Congiunzione di Impiegati su Dipartimento
e Dipartimenti su Codice
In linguaggio SQL si deve scrivere:
SELECT *
FROM Impiegati, Dipartimenti
WHERE Dipartimento = Codice;
Per maggiore chiarezza l’interrogazione si può anche scrivere esplicitando, assieme al nome
degli attributi, il nome delle tabelle alle quali appartengono:
SELECT *
FROM Impiegati, Dipartimenti
WHERE Impiegati.Dipartimento = Dipartimenti.Codice;
262
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Poiché nella condizione scritta accanto a Where viene usato il segno uguale, la congiunzione
precedente fornisce un esempio di equi-join, cioè vengono combinate solo le righe per le
quali si possono trovare valori uguali negli attributi che si corrispondono.
Nella versione del linguaggio SQL adottata da Access l’equi-join viene indicato, in accordo con
la terminologia introdotta nel Capitolo 4, come inner join. Se la precedente interrogazione
viene realizzata in Access in modalità QBE e, successivamente, si accede alla query in
visualizzazione SQL, il comando visualizzato (una volta ripulito dalle parentesi inutili) è il
seguente:
SELECT Impiegati.*, Dipartimenti.*
FROM Dipartimenti INNER JOIN Impiegati ON Dipartimenti.Codice =
Impiegati.Dipartimento;
Nella query, mediante la dichiarazione INNER JOIN, è specificato il tipo di congiunzione da
costruire, e la condizione di congiunzione è scritta nella clausola From del comando Select,
dopo la parola ON.
La sintassi adottata da Access è una variante degli standard proposti in SQL2, mentre il modo
di costruire le congiunzioni presentato in questo paragrafo è quello dello standard di base del
linguaggio. Va precisato che Access (come tutti gli SQL che ammettono quest’ultima sintassi)
accetta ed esegue correttamente le interrogazioni costruite secondo lo standard di base.
Naturalmente, quando il comando Select è costruito direttamente da Access partendo da una
QBE, l’interrogazione è realizzata secondo gli standard tipici della implementazione.
La congiunzione di Impiegati con Dipartimenti secondo una qualsiasi delle precedenti sintassi
produce la tabella in figura. Dal suo esame si nota che è composta da 11 righe e che nella
congiunzione scompare ogni informazione sul dipendente con ID = 5, che non è assegnato ad
alcun dipartimento e, analogamente, si perde ogni informazione sul dipartimento di codice
Pers, perché non ci sono dipendenti in quel dipartimento.
Come si è detto nel Capitolo 4, gli strumenti per recuperare le informazioni sulle righe che non
hanno corrispondenti nella congiunzione sono i join esterni e, in particolare, il left join che è
presentato nel riquadro a fine paragrafo.
Dopo aver visto come si rappresentano nel linguaggio SQL le operazioni fondamentali del
modello relazionale, vediamo ora come con SQL si possa costruire un’interrogazione espressa
tramite una sequenza di operazioni relazionali.
© Istituto Italiano Edizioni Atlas
263
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Per esempio, se si vuole ottenere l’elenco dei dipendenti che lavorano in un dipartimento con
sede a Roma, con cognome, nome e descrizione del dipartimento, occorre dapprima operare
una selezione su Dipartimenti per Sede = ‘Roma’; poi si deve effettuare una congiunzione della
tabella ottenuta con la tabella Impiegati e, infine, applicare una proiezione sugli attributi
Cognome, Nome, Descrizione sulla nuova tabella risultante. In pseudocodifica l’interrogazione
si rappresenta in questo modo:
1. σP Dipartimenti
2. Temp1PK
ImpiegatiFK
3. ΠL Temp2
Temp1=Selezione di Dipartimenti per Sede = ‘Roma’
Temp2=Congiunzione di Temp1 su Codice e Impiegati
su Dipartimento
Proiezione di Temp2 su Cognome, Nome, Descrizione
L’interrogazione viene codificata nel linguaggio SQL con il seguente comando:
SELECT Cognome, Nome, Descrizione
FROM Impiegati, Dipartimenti
WHERE Dipartimento=Codice AND
Sede = 'Roma';
La prima condizione scritta dopo Where (Dipartimento = Codice) serve a specificare l’uguaglianza tra gli attributi comuni delle tabelle coinvolte nella congiunzione, la seconda condizione
(Sede = 'Roma') specifica il criterio per operare la selezione sulle righe di Dipartimenti. Le due
condizioni sono combinate tramite l’operatore AND.
La codifica in SQL diventa più precisa facendo precedere il nome delle tabelle ai nomi degli
attributi, come mostrato nella seguente versione del comando:
SELECT Impiegati.Cognome, Impiegati.Nome,
Dipartimenti.Descrizione
FROM Impiegati, Dipartimenti
WHERE Impiegati.Dipartimento = Dipartimenti.Codice AND
Dipartimenti.Sede = 'Roma';
Per semplificare la scrittura del comando Select è possibile fare ricorso agli alias per il nome
della tabella, specificando dopo il nome originale della tabella la parola AS seguita dal nuovo
nome. Si potrebbe, per esempio, indicare la tabella Impiegati con I e la tabella Dipartimenti con
D, limitando il numero di caratteri da digitare e scrivendo comandi più compatti.
La precedente interrogazione espressa nel linguaggio SQL di Access diventa:
SELECT I.Cognome, I.Nome, D.Descrizione
FROM Impiegati AS I INNER JOIN Dipartimenti AS D ON
I.Dipartimento = D.Codice
WHERE D.Sede = 'Roma';
La scrittura della parola AS è opzionale.
Risulta evidente la maggior chiarezza dell’ultima interrogazione rispetto alle due precedenti: la
sintassi di Access ha il pregio di separare nettamente la condizione di congiunzione, che viene
espressa nella parte From dell’interrogazione, dalle condizioni che devono essere soddisfatte
per operare le selezioni, che sono espresse nella parte Where della query.
Per sopperire alla minor chiarezza delle interrogazioni scritte nella versione SQL1 è opportuno
scrivere la parte Where dell’interrogazione su più righe, come nell’esempio precedente, riportando prima le condizioni per la congiunzione delle tabelle e poi le condizioni che esprimono
la selezione.
264
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Dagli esempi precedenti si può osservare come nel linguaggio SQL con poche parole di codice
sia possibile estrarre da una base di dati tutte le informazioni che si desiderano. Le stesse
operazioni, formulate attraverso le istruzioni di un linguaggio di programmazione tradizionale,
richiederebbero un elevato numero di righe di codice, oltre che lunghi processi di ricerca sui
file e di confronti tra i campi dei record.
IL SELF JOIN E IL LEFT JOIN
Mostriamo, con un esempio, come si possa realizzare un self-join su una tabella. Si
consideri l’associazione esistente tra un oggetto e le sue parti (che sono ancora oggetti).
Consideriamo, in particolare, l’oggetto camicia composto da: 1 colletto, 2 maniche, 10
bottoni, 1 taschino e altri oggetti.
È stata introdotta, di fatto, un’associazione ricorsiva sull’entità Oggetto, di attributi: ID,
Descrizione e Qta, che è rappresentata nel modello relazionale da una tabella con il
seguente schema:
Oggetti (ID, Descrizione, Qta, ComponenteDi)
Nel caso degli oggetti che compongono una
camicia si dovrebbero considerare le 5 righe
della tabella Oggetti mostrata in figura:
Dalla tabella si vede che l’oggetto identificato dall’ID = 4, il bottone, è una componente
dell’oggetto con ID = 1, la camicia, e che in una camicia ci sono 10 bottoni. Naturalmente
nella tabella Oggetti ci saranno, oltre all’oggetto Camicia, anche altri oggetti composti,
quali: giacca, cappotto e altri, con le relative componenti.
Se si vogliono ottenere le informazioni delle diverse parti che compongono gli oggetti,
assieme alle informazioni sugli oggetti composti, occorre congiungere la tabella Oggetti
con se stessa, cioè operare un self-join. Per esprimere la condizione che una riga di Oggetti
deve essere abbinata a una riga, sempre di Oggetti, con il valore di ID uguale a quello di
ComponenteDi nell’altra, occorre usare gli alias per il nome della tabella, cioè indicare con
due nomi diversi la stessa tabella, utilizzando la parola AS nella clausola From dell’interrogazione, come mostrato nell’esempio in figura.
I nomi scelti per rinominare la tabella servono a ricordare i differenti ruoli svolti dalla
medesima tabella Oggetti: le parti nel primo
caso, i composti nel secondo.
© Istituto Italiano Edizioni Atlas
265
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Oltre all’equi-join, il linguaggio SQL permette di costruire forme di join che rispondono
all’esigenza di congiungere due tabelle includendo nella congiunzione anche quelle righe
di una delle due tabelle che non hanno una riga associata nell’altra.
Queste congiunzioni prendono il nome di join esterni e, come si è già detto, corrispondono
alle operazioni di left join, right join, full join dell’algebra relazionale.
Consideriamo tra questi il left join e mostriamo la sua utilità nella soluzione di un tipico
problema di assenza: elencare i dipartimenti che non hanno dipendenti loro assegnati. Per
farlo congiungiamo la tabella Dipartimenti e la tabella Impiegati con un left join. In questa
congiunzione sono incluse tutte le righe di Dipartimenti, comprese quelle dei dipartimenti
senza impiegati associati. Tali righe sono completate con valori nulli in corrispondenza dei
campi di Impiegati considerati nell’interrogazione.
La figura mostra il codice SQL dell’interrogazione e il risultato sulle tabelle dell’esempio.
Si nota, in particolare, la riga con i valori del dipartimento Personale che sono completate
con valori nulli nei campi Nome e Cognome. Per identificare i dipartimenti senza impiegati
bisogna saper riconoscere le righe con valori nulli, per esempio, nel campo Cognome e,
come abbiamo visto nel Paragrafo 6, tali righe si possono selezionare controllando il campo
Cognome con il predicato IS NULL. I dipartimenti senza dipendenti sono allora elencati dal
seguente comando SQL:
SELECT Descrizione
FROM Dipartimenti LEFT JOIN Impiegati ON Dipartimenti.Codice =
Impiegati.Dipartimento
WHERE Cognome IS NULL;
266
ERIA
EB
W
LIBR
AUTOVERIFICA
Domande da 3 a 8 pag. 294-295
Problemi da 3 a 12 pag. 296-297 e da 42 a 49 pag. 298-299
1. Gli altri tipi di join esterni e le operazioni insiemistiche
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
8 Le funzioni di aggregazione
All’interno del comando Select possono essere usate funzioni predefinite che agiscono sui
valori contenuti in insiemi di righe della tabella e che per questo motivo si chiamano funzioni
di aggregazione.
Le funzioni di aggregazione agiscono sui valori di una singola colonna e restituiscono un solo
valore come il massimo o il minimo dei valori considerati. Le righe considerate per l’aggregazione sono quelle prodotte dall’interrogazione e quindi, in presenza di una clausola Where,
sono le sole righe che soddisfano la condizione specificata.
Le funzioni di aggregazione possono essere utilizzate solo come argomento scritto accanto a
Select oppure nella clausola Having (che sarà spiegata nel riquadro alla fine del prossimo
paragrafo).
• Funzione COUNT
La funzione COUNT conta il numero di righe selezionate dall’interrogazione. La sintassi del
linguaggio SQL richiede di specificare come argomento della funzione il nome di un attributo
oppure il carattere * (asterisco): nel primo caso non vengono conteggiate le righe che hanno
valore Null nella colonna dell’attributo specificato; nel secondo caso, indicando l’asterisco, la
funzione Count(*) calcola il numero delle righe della tabella, incluse quelle con campi di tipo
Null. In sostanza la funzione Count(*) serve per ottenere la cardinalità di una relazione.
Il seguente comando restituisce il numero delle righe presenti nella tabella Impiegati (12
nell’esempio):
SELECT COUNT (*)
FROM Impiegati;
Restituisce 12
Specificando il nome dell’attributo Dipartimento come argomento della funzione Count, si
ottiene il numero dei dipendenti della tabella Impiegati che sono assegnati a un dipartimento.
(11 nell’esempio perché nel conteggio non sono considerati i valori nulli).
SELECT COUNT (Dipartimento)
FROM Impiegati;
Restituisce 11
La seguente interrogazione restituisce il numero dei dipendenti residenti a Roma presenti nella
tabella Impiegati:
SELECT COUNT(*)
FROM Impiegati
WHERE Residenza = 'Roma';
Restituisce 2
Il risultato del conteggio può essere anche descritto con un’opportuna intestazione, come già
visto in precedenza, aggiungendo la clausola AS seguita dal nuovo nome da utilizzare come
intestazione di colonna. Diversamente la colonna viene presentata con un’intestazione che
dipende dall’implementazione di SQL: Access, per esempio, nel caso dell’interrogazione considerata, produce l’intestazione EXPR1000, EXPR1001, ecc.
La figura seguente evidenzia il confronto tra i risultati ottenuti con o senza AS.
SELECT COUNT(*), COUNT(*)
FROM Impiegati
WHERE Residenza = 'Roma';
© Istituto Italiano Edizioni Atlas
AS ResidentiRoma
267
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
• Funzione SUM
La funzione SUM restituisce la somma di tutti i valori contenuti in una colonna specificata
come argomento della funzione: naturalmente l’attributo utilizzato nel calcolo deve essere di
tipo numerico; anche con questa funzione si può usare, se necessario, la parola Distinct prima
del nome dell’attributo, se si vogliono eliminare dal calcolo della somma i valori duplicati
presenti nella colonna specificata; i valori nulli sono trascurati dalla funzione Sum.
Per esempio se si vuole ottenere la somma degli stipendi dei dipendenti che appartengono al
dipartimento Amministrazione, occorre usare il comando Select nella forma:
SELECT SUM (Stipendio)
FROM Impiegati
WHERE Dipartimento = 'Amm';
Restituisce 90000
L’argomento della funzione Sum può anche essere un’espressione numerica contenente i
nomi di attributi di tipo numerico. Si supponga, per esempio, di voler conoscere l’ammontare
degli stipendi del reparto Amministrazione e il nuovo ammontare dopo un incremento del 3%.
Si costruisce l’interrogazione:
SELECT SUM (Stipendio) AS StipendiAmm,
SUM (Stipendio*1.03) AS NuoviStipendiAmm
FROM Impiegati
WHERE Dipartimento = 'Amm';
• Funzione AVG
In modo analogo agisce la funzione AVG (dall’inglese average = media), per calcolare la media
dei valori (numerici) contenuti in una determinata colonna di una tabella, con l’eventuale
aggiunta dell’opzione Distinct. L’argomento della funzione può essere un’espressione aritmetica anziché il nome di un attributo. La media calcolata dalla funzione Avg equivale alla media
aritmetica, cioè la somma dei valori diviso il numero dei valori. La funzione Avg non include nel
calcolo i valori di tipo Null presenti nella colonna. Nell’esempio seguente viene calcolato lo
stipendio medio dei dipendenti che lavorano in dipartimenti con sede a Torino:
SELECT AVG(Stipendio)
FROM Impiegati, Dipartimenti
WHERE Dipartimento = Codice AND
Sede = 'Torino';
Restituisce 46916,67
• Funzioni MIN e MAX
Le funzioni MIN e MAX restituiscono rispettivamente il valore minimo e il valore massimo tra
i valori della colonna di una tabella specificata come argomento della funzione; le funzioni Min
e Max consentono di determinare i valori minimi e massimi anche per campi di tipo carattere.
Anche le funzioni Min e Max ignorano i campi con valore Null e possono avere come argomento un’espressione anziché il nome di un attributo. Per esempio, utilizzando un attributo numerico come lo stipendio, si calcolano i valori minimo e massimo degli stipendi di tutti i dipendenti:
SELECT MIN(Stipendio), MAX(Stipendio)
FROM Impiegati;
Restituisce 25000 e 85000
Il seguente esempio di interrogazione invece restituisce il primo cognome e l’ultimo nell’elenco dei
dipendenti, specificando come argomento delle funzioni l’attributo Cognome che è di tipo carattere:
SELECT MIN(Cognome), MAX(Cognome)
FROM Impiegati;
268
Restituisce Bianco e Volpi
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
9 Ordinamenti e raggruppamenti
Nel comando Select si può inserire la clausola ORDER BY per ottenere i risultati di un’interrogazione ordinati secondo i valori contenuti in una o più colonne, tra quelle elencate accanto
alla parola Select. L’indicazione delle colonne da considerare nell’ordinamento avviene precisando il nome della colonna oppure la posizione che essa occupa nella lista che segue la parola
Select: 1 per la prima posizione, 2 per la seconda, e così via.
L’ordinamento può essere crescente (le stringhe dalla A alla Z e i numeri dal minore al
maggiore) oppure decrescente (le stringhe dalla Z alla A e i numeri dal maggiore al minore):
i due tipi di ordinamento sono specificati usando rispettivamente le parole chiave ASC per crescente e DESC per decrescente. L’ordinamento è crescente per default e quindi va specificata
la parola Desc solo se si desidera l’ordinamento decrescente. Negli ordinamenti il valore Null
compare, di norma, all’inizio delle sequenze crescenti e alla fine delle sequenze decrescenti.
La clausola Order By, se presente, deve essere l’ultimo elemento di un comando Select.
Il seguente esempio produce in output l’elenco alfabetico dei dipendenti, con cognome, nome,
residenza:
SELECT Cognome, Nome, Residenza
FROM Impiegati
ORDER BY Cognome, Nome;
L’ordinamento viene fatto su due attributi: a parità di cognome i dipendenti vengono ordinati
per nome. Se i tipi di ordinamento richiesti riguardano più attributi e sono diversi, occorre
aggiungere la parola Desc accanto agli attributi per i quali si vuole l’ordinamento decrescente.
L’esempio seguente produce l’elenco dei dipendenti in ordine decrescente di stipendio e, a
parità di stipendio, in ordine (crescente) di cognome:
SELECT Cognome, Stipendio
FROM Impiegati
ORDER BY Stipendio DESC, Cognome;
Si consideri una tabella delle fatture che contiene tra gli attributi di ogni fattura, la descrizione
del prodotto, il suo prezzo unitario e la quantità ordinata. Il seguente comando Select ordina
l’elenco per valori decrescenti dell’espressione PrezUnit*Qta (campo 4 tra quelli elencati
vicino a Select):
SELECT NomeProdotto, PrezUnit, Qta, PrezUnit*Qta
FROM Fatture
ORDER BY 4 DESC;
Forma sconsigliata
Si osservi però che l’uso del precedente comando non è raccomandato perché la sua lettura
è complicata dalla necessità di riesaminare la clausola Select per capire quale sia il tipo di
ordinamento richiesto. Non solo: se, in un secondo tempo, si deve modificare l’elenco dei
campi nella clausola Select, bisogna ricordarsi di modificare il valore specificato nella clausola
Order By. In queste situazioni, si raccomanda di ridefinire il nome del campo contenente
l’espressione con la parola AS e di definire l’ordinamento nella clausola Order By, in modo
simbolico, mediante questo nome.
SELECT NomeProdotto, PrezUnit, Qta, PrezUnit*Qta AS Totale
FROM Fatture
Forma raccomandata
ORDER BY Totale DESC;
© Istituto Italiano Edizioni Atlas
269
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Con le funzioni di aggregazione si condensano le informazioni di una tabella in un solo valore
come, per esempio, la somma degli stipendi di tutti i dipendenti. Spesso è però utile sintetizzare i valori per classi omogenee, secondo opportuni criteri di raggruppamento, per esempio
per produrre la somme parziali degli stipendi nei diversi dipartimenti.
La clausola GROUP BY ha questo scopo, in quanto permette di raggruppare un insieme di
righe aventi lo stesso valore nelle colonne indicate dalla clausola. L’opzione produce una riga
di risultati per ogni raggruppamento. Se nel comando viene inserita una funzione di aggregazione, come Sum o Count, per ciascuna riga della tabella risultante viene prodotto un valore
di raggruppamento. I valori Null sono raggruppati, ma non vengono valutati da nessuna delle
funzioni di aggregazione ad eccezione di Count(*).
Quando si utilizza una clausola Group By, tutti gli attributi che compaiono nella lista accanto alla
parola Select devono essere inclusi nella clausola Group By oppure devono essere argomenti
di una funzione di aggregazione.
Il comando seguente elenca i dipartimenti dove lavorano i dipendenti, con la somma degli
stipendi e il numero dei dipendenti per ogni dipartimento:
SELECT Dipartimento, COUNT(ID) AS Dipendenti, SUM(Stipendio) AS Stipendi
FROM Impiegati
GROUP BY Dipartimento;
L’interrogazione viene eseguita per passi:
1. le righe sono raggruppate per dipartimento
2. le funzioni di aggregazione sono applicate ai singoli raggruppamenti.
Se nell’elenco prodotto si desidera che compaia il nome per esteso del dipartimento, bisogna
includere anche la tabella Dipartimenti nell’interrogazione ed effettuare il raggruppamento sul
campo Descrizione:
SELECT Descrizione, COUNT(*) AS Dipendenti, SUM(Stipendio) AS Stipendi
FROM Impiegati, Dipartimenti
WHERE Impiegati.Dipartimento = Dipartimenti.Codice
GROUP BY Descrizione;
Questa interrogazione differisce dalla precedente non solo per la presenza del nome del
dipartimento al posto del suo codice, ma anche per il fatto che nell’elenco generato non ci sono
le informazioni sui dipendenti che non sono inquadrati in alcun dipartimento, in quanto queste
righe sono escluse dalla congiunzione tra le due tabelle. Si osservi anche l’uso di: COUNT(*)
al posto di COUNT(ID), che conta le righe prodotte nei singoli raggruppamenti.
270
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
CONDIZIONI SUI RAGGRUPPAMENTI
La struttura del comando Select con raggruppamenti può essere ulteriormente ampliata
con la clausola HAVING con la quale è possibile sottoporre al controllo di una o più
condizioni i gruppi creati con la clausola Group by. La condizione scritta dopo Having in
genere controlla il valore restituito dalle funzioni di aggregazione (Count, Sum, Avg, Min,
Max).
Si noti che la clausola Having deve essere usata insieme a Group By: dopo che Group By
ha formato i raggruppamenti di righe, Having serve a visualizzare le sole righe dei raggruppamenti che soddisfano alle condizioni scritte accanto a Having.
Il seguente esempio mostra l’uso del comando Select per ottenere, per i soli dipartimenti
con più di 2 addetti, il numero degli addetti e la somma degli stipendi. L’elenco si limita al
solo dipartimento Produzione che ha 3 addetti.
SELECT Dipartimento, COUNT(ID) AS Dipendenti, SUM(Stipendio) AS Stipendi
FROM Impiegati
GROUP BY Dipartimento
HAVING COUNT(ID) > 2;
Se l’istruzione Select contiene la clausola Where, i valori vengono raggruppati dopo aver
operato la selezione sulle righe che rispettano le condizioni scritte accanto a Where.
Con il seguente comando si ottiene l’elenco dei dipartimenti con sede a Torino con più di
un addetto: per questi dipartimenti viene elencato oltre al nome anche il numero di
impiegati e la somma degli stipendi:
La clausola Having presenta caratteristiche analoghe alla clausola Where, ma agisce in
modo differente: con Where vengono poste condizioni sulle righe della tabella, con Having
il controllo delle condizioni viene fatto sui risultati delle funzioni di aggregazione applicate
a gruppi di righe; in sostanza: Having pone condizioni sui gruppi, Where pone condizioni
sulle singole righe.
Per realizzare l’ultima interrogazione con Access in modalità QBE bisogna trovare il modo
di esprimere nella griglia posta nella parte inferiore della QBE sia le condizioni sui raggruppamenti (in Having) sia le condizioni sulle righe (clausola Where).
Operando come descritto nel Capitolo 5, si fa clic sul pulsante Totali per attivare la
riga Formula nella griglia QBE e si definiscono nei diversi campi raggruppamenti,
conteggi, somme in base alle richieste del problema.
A questo punto ogni condizione scritta nella riga Criteri della QBE viene interpretata da
Access come una condizione sui raggruppamenti e si può verificare che viene inserita di
seguito a Having nella Visualizzazione SQL della query.
© Istituto Italiano Edizioni Atlas
271
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Per indicare che i raggruppamenti devono essere effettuati solo sulle righe dei dipartimenti
con sede a Torino, bisogna inserire il campo Sede in una colonna dello schema QBE e, nella
riga della Formula, in corrispondenza di Sede, selezionare Dove dal menu a discesa.
Il segno di spunta in corrispondenza di Mostra del campo Sede viene tolto automaticamente e si può verificare che la condizione espressa nella riga Criteri di Sede viene inserita
di seguito a Where nella Visualizzazione SQL della query.
Sintetizziamo in un unico quadro le diverse clausole che possono apparire nel comando
Select:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Elenco colonne da mostrare
Tabelle da cui estrarre le righe
Condizioni sulle righe estratte
Campi da considerare per i raggruppamenti
Condizioni sui raggruppamenti
Ordinamenti sulle colonne elencate nella clausola SELECT
È opportuno fare le seguenti precisazioni:
• Le uniche clausole che devono comparire obbligatoriamente in un comando Select sono
le prime due dell’elenco, le altre sono facoltative.
• Le clausole utilizzate devono essere elencate rispettando l’ordinamento del precedente
elenco: Select deve precedere From, ..., Having deve precedere Order by.
• Le interrogazioni che si possono costruire con le operazioni relazionali si esprimono con
le sole clausole Select, From e Where.
• Il DBMS esegue il comando elaborando le clausole nel seguente ordine:
272
£ Where £ Group by £ Having £ Select £ Order by
ERIA
EB
W
LIBR
From
2. Query di comando e query di servizio in Access
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
10 Le condizioni di ricerca
Le condizioni di ricerca sono utilizzate nelle clausole Where e Having per determinare i criteri
di selezione rispettivamente delle righe e dei raggruppamenti. Nella scrittura delle condizioni
si usano i segni del confronto =, <, >, <>, >=, <=.
Una condizione di ricerca è costruita anche mettendo insieme più condizioni legate tra loro con
gli operatori AND e OR, precedute eventualmente dall’operatore NOT. L’ordine di applicazione
degli operatori è il seguente: NOT viene applicato prima di AND e AND prima di OR.
Le condizioni di ricerca si possono esprimere utilizzando anche altre parole del linguaggio SQL
che indicano operatori o predicati, con i quali è possibile rendere più raffinate ed espressive le
interrogazioni alla base di dati.
• BETWEEN
L’operatore BETWEEN controlla se un valore è compreso all’interno di un intervallo di valori,
inclusi gli estremi. È possibile specificare, anteponendolo a Between, anche l’operatore logico
NOT per valutare la condizione opposta, cioè per controllare se il valore non rientra nell’intervallo specificato.
Per ottenere l’elenco dei dipendenti (con cognome, nome, residenza) che hanno retribuzione
compresa tra 30000 e 45000 euro, si può usare la parola Between nella scrittura della
condizione dopo Where:
SELECT Cognome, Nome, Residenza
FROM Impiegati
WHERE Stipendio BETWEEN 30000 AND 45000;
La condizione specificata con Between nella clausola Where è preferibile, per chiarezza e
sinteticità, alla condizione equivalente:
Stipendio>=30000 AND Stipendio<=45000
• IN
L’operatore IN controlla se un valore appartiene a uno dei valori di una lista che viene precisata
dopo la parola In all’interno della condizione. Anche IN può essere preceduto da NOT per
indicare la condizione opposta, cioè la non appartenenza del valore all’insieme dei valori.
Per ottenere tutti i dati dei dipendenti che risiedono a Torino, Venezia e Palermo, si usa il
comando Select nella forma:
SELECT *
FROM Impiegati
WHERE Residenza IN ('Torino','Venezia','Palermo');
Anche in questo caso la condizione espressa con In nella clausola Where è sicuramente
preferibile alla condizione equivalente:
Residenza ='Torino' OR Residenza ='Venezia' OR Residenza ='Palermo'
• LIKE
L’operatore LIKE confronta il valore di un attributo di tipo carattere con un modello di stringa
che può contenere caratteri jolly (o metacaratteri). Anche in questo caso si può usare
l’operatore NOT prima di Like per indicare criteri di ricerca opposti. Per l’uso dell’operatore
LIKE nelle interrogazioni SQL di Access valgono le convenzioni descritte nel capitolo precedente.
© Istituto Italiano Edizioni Atlas
273
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
I caratteri jolly sono:
_ (underline o underscore) per indicare uno e un solo carattere qualsiasi in quella posizione
della stringa;
% (percento) per indicare una sequenza di zero o più caratteri in quella posizione della stringa.
Per esempio:
LIKE 'xyz%' vengono ricercate tutte le stringhe che iniziano con i caratteri 'xyz';
LIKE '%xyz' serve a ricercare tutte le stringhe che finiscono con i caratteri 'xyz';
LIKE '%xyz%' per tutte le stringhe di 3 o più caratteri che contengono i caratteri 'xyz';
LIKE '_xyz' controlla le stringhe di 4 caratteri che finiscono con 'xyz'.
L’operatore Like utilizzato con un modello di stringa che non contiene caratteri jolly è del tutto
equivalente all’operatore =.
Con il comando Select scritto nella forma seguente, è possibile ottenere il cognome e il
dipartimento dei dipendenti con il cognome che inizia con ‘R’;
SELECT Cognome, Dipartimento
FROM Impiegati
WHERE Cognome LIKE 'R%';
Per ricercare uno dei caratteri jolly in una stringa si deve usare uno speciale carattere, detto
carattere escape per qualificare il carattere come carattere da ricercare e non come un
metacarattere. Il carattere escape viene precisato con la dichiarazione ESCAPE.
Per esempio, per ricercare la presenza del carattere _ nel nome di un dipartimento, si usa la
seguente condizione:
LIKE '%$_%' ESCAPE '$'.
Il carattere ‘$’ è il carattere escape e, pertanto, la sequenza ‘$_’ precisa che il carattere _
(underline) è il carattere da ricercare nella stringa e non un carattere jolly.
Si noti che il linguaggio SQL di Access accetta, come molte altre implementazione di SQL, la
coppia di caratteri jolly: ? ed * in sostituzione dei caratteri di sottolineatura _ e di percentuale
%. In sostanza nel linguaggio SQL di Access:
- con ? si vuole indicare la presenza di uno e un solo carattere nella stringa modello;
- il carattere * indica una sequenza qualsiasi (anche vuota) di caratteri.
• IS NULL
Il predicato IS NULL confronta il valore in una colonna con il valore Null. L’uso di questo
predicato è il solo modo per controllare la presenza del valore Null in una colonna. È possibile
inserire l’operatore di negazione NOT per valutare la condizione opposta: in altre parole, per
controllare se un attributo non ha valore nullo, si usa il predicato IS NOT NULL. L’operatore
Is viene utilizzato solo con la parola Null.
Per esempio se si vuole ottenere l’elenco con cognome e nome dei dipendenti per i quali è
indicato lo stipendio, si deve scrivere la seguente istruzione Select:
SELECT Cognome, Nome
FROM Impiegati
WHERE Stipendio IS NOT NULL;
274
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
INTERROGAZIONI NIDIFICATE
Supponiamo di voler conoscere Nome, Cognome e Dipartimento del dipendente con lo
stipendio massimo. Per risolvere il problema si può ricercare, con l’interrogazione in figura,
lo stipendio di valore massimo fra quelli di tutti i dipendenti.
Annotato il valore dello stipendio massimo si ricerca il dipendente con tale stipendio
costruendo l’interrogazione mostrata nella Query2 in figura.
Il linguaggio SQL ha un’interessante caratteristica secondo la quale si può sostituire a una
costante in una clausola Where, l’interrogazione che genera tale costante. Ne segue che,
in virtù di questa regola, le due precedenti interrogazioni possono essere utilizzate per
costruire l’interrogazione nidificata in figura.
L’esempio mostra come si possa usare un Select al posto di una costante in una clausola
Where. Si costruisce cosi un comando Select che contiene un altro comando SELECT al
proprio interno. Il comando interno è indicato con il nome di sottoquery e deve comparire
racchiuso in una coppia di parentesi senza il punto e virgola finale.
Si consideri, come ulteriore esempio, il problema di elencare cognome e nome dei dipendenti che hanno lo stipendio inferiore allo stipendio medio di tutti i dipendenti. Ricordando
che un comando Select può sostituire una costante in una clausola Where, si può costruire
la query StipendiInferioriMedia.
© Istituto Italiano Edizioni Atlas
275
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Il comando Select interno restituisce il valore medio degli stipendi; questo dato viene usato
nell’interrogazione principale per il confronto con i valori dell’attributo Stipendio nel criterio
di selezione scritto dopo Where.
Si noti che le interrogazioni nidificate introducono una modalità alternativa a quella dell’algebra
relazionale per risolvere problemi. Per esempio, per conoscere nome e cognome del manager
del dipartimento Personale, si può usare sia un’interrogazione nidificata, sia le abituali
tecniche dell’algebra relazionale. Il codice SQL dell’interrogazione ManagerDiPersonale
secondo le due differenti modalità è mostrata in figura.
Le interrogazioni nidificate possono essere viste come un modo diverso per risolvere
problemi ma, soprattutto, sono lo strumento che permette di affrontare problemi che non
si potrebbero risolvere con i comandi esaminati sino ad ora. Le interrogazioni nidificate
StipendioMax e StipendiInferioreMedia sono esempi di interrogazioni che risolvono problemi impossibili da risolvere con le tradizionali modalità dell’algebra relazionale, in quanto le
funzioni di aggregazione non possono comparire nella clausola Where, ma solo nelle
clausole Select ed Having.
Si osservi che la sottoquery deve apparire come secondo termine nei confronti. Pertanto
una clausola Where del tipo:
WHERE ( SELECT AVG(Stipendio) FROM Impiegati ) > Stipendio
non è ammessa, e la condizione della clausola Where deve essere scritta nel seguente
modo:
WHERE Stipendio < ( SELECT AVG(Stipendio) FROM Impiegati )
• Sottointerrogazioni che restituiscono un elenco di valori
Sino ad ora si sono considerate sottointerrogazioni che restituiscono un singolo valore. Il
prossimo esempio mostra l’utilità delle sottointerrogazioni che restituiscono un elenco di
valori.
Si consideri il problema di elencare, con Nome, Cognome e Stipendio, i dipendenti che
sono manager. Procediamo, come nel caso della query StipendioMax, e costruiamo, con
l’interrogazione in figura, l’elenco dei codici identificativi dei dipendenti che sono manager:
276
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Disponendo dell’elenco degli ID dei dipendenti che sono manager è molto semplice
produrre l’elenco richiesto, come è mostrato in DatiManager.
Sostituendo all’elenco con i codici dei manager il comando Select che lo genera, si ottiene
la query annidata in figura che risolve il problema.
Per costruire l’interrogazione DatiManager si è fatto uso di una regola della sintassi del
linguaggio SQL che afferma che un elenco di valori che compare dopo il predicato IN, in
una clausola Where, può essere sostituito dalla sottointerrogazione che lo genera.
Analogamente, l’elenco dei dipendenti che non sono capi di dipartimento si ottiene, con
l’interrogazione:
SELECT Cognome, Nome, Stipendio
FROM Impiegati
WHERE ID NOT IN ( SELECT DISTINCT Manager
FROM Dipartimenti );
Si noti in particolare, nella sottoquery, l’uso della clausola DISTINCT per impedire che i
manager a capo di più di un dipartimento compaiano più volte. Si ricordi che il predicato
IN utilizzato nella forma x IN Elenco, è vero se x appartiene all’elenco, mentre è falso se
x non compare in Elenco.
L’elenco generato dalla sottoquery può essere controllato, oltre che con i predicati IN e
NOT IN, anche con altri predicati (ALL, ANY ed EXISTS) che sono presentati nei materiali
on line richiamati alla fine del paragrafo.
• Numero dei valori diversi tra loro in una colonna
Si consideri ora il problema di calcolare da quante differenti città di residenza provengono
i dipendenti del dipartimento Produzione. Nel linguaggio SQL si usa la funzione Count con
la clausola Distinct come nel seguente comando:
SELECT COUNT(DISTINCT Residenza)
FROM Impiegati
WHERE Dipartimento = 'Prod';
© Istituto Italiano Edizioni Atlas
Restituisce 2
277
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
La clausola Distinct non può essere usata nel formato con l’asterisco Count(*).
Il linguaggio SQL di Access non consente l’uso della clausola Distinct all’interno della
funzione Count. Il problema può essere risolto con la seguente interrogazione nidificata,
inserita direttamente nella clausola From:
SELECT COUNT(*)
FROM ( SELECT DISTINCT Residenza
FROM Impiegati
WHERE Dipartimento = 'Prod');
• Sottoquery in modalità QBE
Access ammette l’uso delle interrogazioni annidate. Il loro inserimento può essere effettuato, come abbiamo mostrato negli esempi precedenti, scrivendo l’interrogazione direttamente nella finestra SQL delle query. Per inserire una sottoquery in modalità QBE,
occorre scrivere l’istruzione Select che rappresenta la sottoquery nella riga Criteri della
griglia QBE.
La sottoquery va scritta all’interno di una coppia di parentesi tonde e, per rendere più
agevole la scrittura del comando, è opportuno usare la finestra di ingrandimento che si apre
facendo clic con il tasto destro del mouse e scegliendo Zoom nel menu di scelta rapida.
Nella figura, che mostra la precedente interrogazione DatiManager in Visualizzazione Struttura, si noti la sottoquery che produce l’elenco degli ID dei manager da controllare con il
predicato IN.
• Query di ricerca dati duplicati in Access
La ricerca di valori duplicati in una colonna di una tabella si può eseguire con una query
prodotta da una creazione guidata. Per generare la query si attiva la Creazione guidata
query (nella scheda Crea, gruppo Query) e, nella finestra Nuova query si sceglie Creazione guidata Query ricerca duplicati. Il generatore, in successive finestre di dialogo,
richiede di specificare: la tabella e il campo nel quale cercare i valori duplicati e quali altri
campi devono essere visualizzati nell’output generato. Al termine dell’interazione la query
è salvata con un nome opportuno ed eseguita automaticamente.
Per esempio, la ricerca di valori duplicati nel campo Manager di Dipartimenti può essere
utile per identificare i manager responsabili di più di un dipartimento. Nell’autocomposizione
bisogna richiedere di cercare nella tabella Dipartimenti i valori duplicati di Manager e, oltre
al valore di tale campo, di visualizzare anche quello di Descrizione. Access genera la query
Trova duplicati per Dipartimenti in figura.
278
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Il codice SQL dell’interrogazione è il seguente:
Come si vede, la query di ricerca dei dati duplicati utilizza una query nidificata per generare
l’elenco dei manager che compaiono più di una volta in Dipartimenti. Nell’interrogazione
nidificata compare una sottoquery che produce, con un controllo sui raggruppamenti,
l’elenco dei valori duplicati.
ERIA
EB
W
LIBR
AUTOVERIFICA
Domande da 9 a 14 pag. 295
Problemi da 13 a 36 pag. 297-298 e da 50 a 72 pag. 299
3a. Intersezione e differenza con il predicato IN
3b. I predicati ANY, ALL, EXISTS
11 Le viste logiche
Il linguaggio SQL consente di decidere le modalità con le quali gli utenti possono vedere le
tabelle del database, creando una finestra, detta VIEW (vista), su alcuni o su tutti i dati
contenuti in una o più tabelle. La vista viene identificata con un nome assegnato in fase di
creazione con il comando CREATE VIEW.
Con le viste è possibile decidere anche che un utente possa avere una visione solo parziale dei dati
registrati nel database, e non possa vedere altri dati: in questo modo si elimina il rischio di modifiche indesiderate su dati che non riguardano il lavoro di un determinato utente e nello stesso tempo
l’utente non rimane distratto dai dati che sono ininfluenti sul tipo di elaborazione che deve fare.
L’utente può comunque operare sulla vista con i comandi illustrati nei paragrafi precedenti,
come se fosse una tabella del database. Le viste sono finestre dinamiche sulle tabelle del
database, in quanto ogni modifica ai dati sulla tabella primaria è disponibile per l’utente
attraverso la vista. Vale anche l’opposto: ogni modifica sui dati della vista si riflette sui dati della
tabella primaria. Non tutte le viste sono, però, aggiornabili: infatti le viste che contengono
risultati di funzioni di aggregazione non possono essere modificate.
© Istituto Italiano Edizioni Atlas
279
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
La creazione della vista viene realizzata con l’uso dell’istruzione Select all’interno del comando
Create View. Per esempio, per creare una vista di nome ImpiegatiCapi contenente i dati dei
manager, si usa il comando:
CREATE VIEW ImpiegatiCapi AS
SELECT ID, Nome, Cognome, Dipartimento
FROM Impiegati
WHERE ID IN (10,12,13,14);
essendo 10, 12, 13, 14 gli identificativi dei manager.
Una vista può essere eliminata con il comando DROP VIEW seguito dal nome assegnato alla
vista in fase di creazione. Per esempio, il comando seguente elimina la vista creata con il nome
ImpiegatiCapi:
DROP VIEW ImpiegatiCapi;
La versione SQL di Access non prevede il comando Create View, ma le query, salvate con un
nome simbolico, sono, a tutti gli effetti, viste logiche e, come queste, possono essere utilizzate
con i comandi Select.
VISTE LOGICHE CON RAGGRUPPAMENTI E CONTROLLO DELLE CONDIZIONI
Le viste logiche possono semplificare la progettazione di query complesse. Mostriamo con
un esempio come utilizzare le viste logiche per affrontare problemi impossibili da risolvere
diversamente.
Costruiamo la vista logica di nome PersonaleDipartimenti che elenca, per ogni dipartimento, il totale degli stipendi erogati e il numero dei dipendenti che lavorano nel dipartimento:
CREATE VIEW PersonaleDipartimenti AS
SELECT Dipartimenti AS Dipart,
COUNT(*) AS NumDipendenti,
SUM(Stipendio) AS TotStipendi
FROM Impiegati
GROUP BY Dipartimenti;
Il comando Create View crea una vista logica con tre attributi di nome Dipart, NumDipendenti,
TotStipendi con i quali si fa riferimento, nell’ordine, ai tre valori prodotti dalla clausola Select
dell’interrogazione. Partendo dalla vista logica PersonaleDipartimenti si possono costruire
le interrogazioni seguenti:
• Dipartimento che spende di più in stipendi
SELECT Dipart
FROM PersonaleDipartimenti
WHERE TotStipendi = (SELECT MAX(TotStipendi)
FROM PersonaleDipartimenti);
• Numero medio di dipendenti per dipartimento
SELECT AVG(NumDipendenti)
FROM PersonaleDipartimenti;
Si osservi che non sarebbe stato possibile produrre questi risultati con un’interrogazione
basata sulla tabella Impiegati.
280
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
12 Esempi di interrogazioni con uso del linguaggio SQL
PROGETTO 5
Attività sportive studentesche
Le informazioni relative alle attività sportive studentesche devono essere organizzate in
una base di dati. Gli studenti, dei quali si conservano le informazioni anagrafiche, frequentano gli Istituti superiori, e possono partecipare a una o più manifestazioni sportive (specialità sportive diverse, giornate diverse, campionati che durano per mesi o gare di un
giorno). Per ogni attività sportiva le scuole indicano un professore che svolge la funzione
di riferimento e di allenatore: ogni professore segue una sola manifestazione, ma una
stessa manifestazione può essere seguita da professori diversi di scuole diverse.
Definire il modello del database e rappresentare le seguenti interrogazioni:
• Numero degli studenti che partecipano a una determinata manifestazione sportiva.
• Elenco anagrafico degli allenatori di un’attività sportiva.
• Elenco delle scuole (denominazione) con il numero di studenti che partecipano alle
attività sportive.
• Elenco delle scuole (con denominazione, indirizzo, telefono) con studenti che partecipano a una determinata manifestazione sportiva.
• Elenco dei professori (cognome e nome) e scuole (denominazione) di appartenenza in
ordine alfabetico.
• Numero degli studenti partecipanti di una determinata scuola per ciascuna delle manifestazioni sportive.
ANALISI DEI DATI
Le entità che possono essere individuate nel problema sono:
• Istituto, per gli istituti di appartenenza di studenti e professori;
• Studente, per gli studenti delle diverse scuole che partecipano alle manifestazioni;
• Professore, per rappresentare i docenti che svolgono le funzioni di allenatore;
• Manifestazione, per le attività sportive.
Gli attributi di Istituto sono: codice dell’istituto, denominazione, indirizzo, telefono.
Gli attributi di Studente sono: codice dello studente, cognome, nome, data di nascita,
classe.
Gli attributi di Professore sono: codice del professore, cognome, nome.
Gli attributi di Manifestazione sono: codice della manifestazione, descrizione, luogo, data
di inizio per i tornei e i campionati o di svolgimento per le gare di una giornata.
Tra l’entità Istituto e l’entità Studente esiste un’associazione uno a molti, perché gli
studenti che partecipano alle manifestazioni possono provenire da più istituti e ogni studente frequenta un solo istituto.
Tra l’entità Studente e l’entità Manifestazione esiste un’associazione molti a molti, perché
ogni studente partecipa a una o più manifestazioni e, ovviamente, a ogni manifestazione
partecipano più studenti.
Tra l’entità Manifestazione e l’entità Professore si stabilisce un’associazione uno a molti,
perché ogni manifestazione può avere più professori come coordinatori, provenienti da
scuole diverse; il testo del problema inoltre pone il vincolo che ogni professore possa
seguire una sola manifestazione.
Tra l’entità Istituto e l’entità Professore esiste un’associazione uno a molti, perché ogni
istituto può avere molti docenti che si occupano delle manifestazioni sportive e ogni
docente è titolare di insegnamento in un solo istituto.
© Istituto Italiano Edizioni Atlas
281
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Sulla base dell’analisi effettuata si può disegnare il modello Entità/Associazioni.
MODELLO E/R
Studente
N
1
Frequentare
CodiceStud {PK}
CognStud
NomeStud
DataNascita
Classe
Istituto
CodiceIstituto {PK}
Denominazione
Indirizzo
Telefono
1
N
Impiegare
Partecipare
N
Manifestazione
CodiceManif {PK}
Descrizione
Luogo
DataInizio
N
1
N
Coordinare
Professore
CodiceProf {PK}
CognProf
NomeProf
Nel modello E/R sono stati indicati i nomi delle associazioni e l’opzionalità od obbligatorietà
della partecipazione all’associazione (rispettivamente con linea tratteggiata o continua).
Il modello viene verificato utilizzando le regole di lettura del modello E/R:
Ogni istituto può essere frequentato da uno o più studenti, ogni studente deve frequentare
un solo istituto.
Ogni istituto può impiegare uno o più professori, ogni professore deve essere impiegato
presso un solo istituto.
Ogni studente può partecipare a una o più manifestazioni, ogni manifestazione può essere
seguita da uno o più studenti.
Ogni manifestazione può essere coordinata da uno o più professori, ogni professore può
coordinare una sola manifestazione.
Utilizzando le regole di derivazione si passa dal modello concettuale al modello logico, cioè
alle tabelle: le associazioni uno a molti si rappresentano introducendo le chiavi esterne
nelle tabelle Studenti e Professori per indicare l’istituto di appartenenza; nella tabella
Professori viene aggiunta anche un’altra chiave esterna per l’associazione con l’entità
Manifestazione; l’associazione molti a molti genera una nuova tabella Iscrizioni che contiene le chiavi primarie di Studenti e Manifestazioni più eventuali attributi dell’associazione,
per esempio la data di iscrizione.
TABELLE
Istituti (CodiceIstituto, Denominazione, Indirizzo, Telefono)
Studenti (CodiceStud, CognStud, NomeStud, DataNascita, Classe, CodiceIstituto)
Manifestazioni (CodiceManif, Descrizione, Luogo, DataInizio)
Professori (CodiceProf, CognProf, NomeProf, CodiceIstituto, CodiceManif)
Iscrizioni (ID, CodiceStud, CodiceManif, DataIscrizione).
282
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Le caratteristiche degli attributi delle tabelle sono illustrate nello schema seguente:
Tabella
Attributo
Chiave
Formato
Istituti
Studenti
CodiceIstituto
Denominazione
Indirizzo
Telefono
PK
carattere
carattere
carattere
carattere
CodiceStud
CognStud
NomeStud
DataNascita
Classe
CodiceIstituto
PK
numerico (intero)
carattere (30)
carattere (20)
data/ora
numerico (byte)
carattere (4)
sì
sì
no
no
no
sì
Manifestazioni
CodiceManif
Descrizione
Luogo
DataInizio
PK
carattere (3)
carattere (40)
carattere (20)
data/ora
sì
sì
no
no
Professori
CodiceProf
CognProf
NomeProf
CodiceIstituto
CodiceManif
PK
numerico (intero)
carattere (30)
carattere (20)
carattere (4)
carattere (3)
sì
sì
no
sì
sì
ID
CodiceStud
CodiceManif
DataIscrizione
PK
FK
FK
numerico (autoinc)
numerico (intero)
carattere (3)
data/ora
sì
sì
sì
no
Iscrizioni
FK
FK
FK
Indicizzato
(4)
(30)
(30)
(12)
sì
sì
no
no
INTERROGAZIONI
Le costanti utilizzate nelle condizioni di ricerca sono indicate tra parentesi quadre.
Nella rappresentazione delle interrogazioni mediante pseudocodifica sono stati inseriti
commenti nei punti dove sono previste operazioni quali ordinamenti, raggruppamenti e
calcoli che non sono previste nel modello relazionale e non hanno una forma di rappresentazione standardizzata.
Numero degli studenti che partecipano a una determinata manifestazione sportiva.
1. σP Manifestazioni
2. Temp1PK
IscrizioniFK
3.
Temp1 = Selezione di Manifestazioni per Descrizione = [manifestazione]
Temp2 = Congiunzione di Temp1 e Iscrizioni su CodiceManif
Conteggio delle righe di Temp2
SELECT COUNT(*) AS NumeroStudenti
FROM Manifestazioni, Iscrizioni
WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManif AND
Descrizione = [manifestazione da controllare];
Elenco anagrafico degli allenatori di un’attività o manifestazione sportiva.
1. σP Manifestazioni
Temp1 = Selezione di Manifestazioni per Descrizione = [manifestazione]
2. Temp1PK
ProfessoriFK Temp2 = Congiunzione di Temp1 e Professori su CodiceManif
3. ΠL Temp2
Proiezione di Temp2 su CognProf, NomeProf Ordinato su CognProf
e NomeProf
© Istituto Italiano Edizioni Atlas
283
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
SELECT CognProf, NomeProf
FROM Manifestazioni, Professori
WHERE Manifestazioni.CodiceManif = Professori.CodiceManif AND
Descrizione = [manifestazione da controllare]
ORDER BY CognProf, NomeProf;
Elenco delle scuole (denominazione) con il numero di studenti che partecipano alle attività
sportive.
1. IstitutiPK
StudentiFK
Temp1 = Congiunzione di Istituti e Studenti su CodiceIstituto
2.
Temp2 = raggruppamento per Denominazione e Conteggio
3. ΠL Temp2
Proiezione di Temp2 su Denominazione, conteggio
SELECT Denominazione, COUNT (DISTINCT CodiceStud) AS Numero
FROM Studenti, Istituti
WHERE Studenti.CodiceIstituto = Istituti.CodiceIstituto
GROUP BY Denominazione;
Elenco delle scuole (con denominazione, indirizzo, telefono) con studenti che partecipano
a una determinata manifestazione sportiva.
1. σP Manifestazioni
2. Temp1PK
IscrizioniFK
Temp1 = Selezione di Manifestazioni per Descrizione = [manifestazione]
Temp2 = Congiunzione di Temp1 e Iscrizioni su CodiceManif
3. Temp2FK
StudentiPK
Temp3 = Congiunzione di Temp2 e Studenti su CodiceStud
4. Temp3FK
IstitutiPK
Temp4 = Congiunzione di Temp3 e Istituti su CodiceIstituto
5.
Temp5 = Raggruppamento di Temp4 per Denominazione
6. ΠL Temp5
Proiezione di Temp5 su Denominazione, Indirizzo, Telefono
SELECT Denominazione, Indirizzo, Telefono
FROM Manifestazioni, Iscrizioni, Studenti, Istituti
WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManif AND
Studenti.CodiceStud = Iscrizioni.CodiceStud AND
Studenti.CodiceIstituto = Istituti.CodiceIstituto AND
Descrizione = [manifestazione da controllare]
GROUP BY Denominazione, Indirizzo, Telefono;
Elenco alfabetico dei professori (cognome e nome) e scuole (denominazione) di appartenenza.
1. IstitutiPK
2. ΠL Temp1
ProfessoriFK
Temp1 = Congiunzione di Istituti e Professori su CodiceIstituto
Proiezione di Temp1 su CognProf, NomeProf, Denominazione
ordinato su CognProf e NomeProf
SELECT CognProf, NomeProf, Denominazione
FROM Professori, Istituti
WHERE Professori.CodiceIstituto = Istituti.CodiceIstituto
ORDER BY CognProf, NomeProf;
284
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Numero degli studenti partecipanti di una determinata scuola per ciascuna delle manifestazioni sportive.
1. σP Istituti
2. Temp1PK
StudentiFK
Temp1 = Selezione di Istituti per Denominazione = [scuola]
Temp2 = Congiunzione di Temp1 e Studenti su CodiceIstituto
3. Temp2PK
IscrizioniFK
Temp3 = Congiunzione di Temp2 e Iscrizioni su CodiceStud
4. Temp3FK
ManifestazioniPK Temp4 = Congiunzione di Temp3 e Manifestazioni su CodiceManif
5.
Temp5 = Raggruppamento di Temp4 per Descrizione e Conteggio
6. ΠL Temp5
Proiezione di Temp5 su Descrizione, conteggio
SELECT Descrizione, COUNT(*) AS Numero
FROM Manifestazioni, Iscrizioni, Studenti, Istituti
WHERE Manifestazioni.CodiceManif = Iscrizioni.CodiceManif AND
Studenti.CodiceStud = Iscrizioni.CodiceStud AND
Studenti.CodiceIstituto = Istituti.CodiceIstituto AND
Denominazione = [scuola da controllare]
GROUP BY Descrizione;
PROGETTO 6
Viaggi e vacanze
Un’agenzia di viaggi intende organizzare in una base di dati tutte le informazioni riguardanti
la sua attività: i viaggi o vacanze, le organizzazioni turistiche o tour operator, i clienti dei
propri servizi, le nazioni o località o città che sono destinazione dei viaggi/vacanze.
Tutte le attività proposte ai clienti sono dei pacchetti: ciascuno di essi si riferisce a un’organizzazione turistica, e riguardano una precisa zona del mondo o nazione o città. Ci
possono essere offerte di viaggi con la stessa destinazione da parte di organizzazioni
diverse.
Per esempio ci può essere una crociera nel Mediterraneo proposta dall’organizzazione
turistica A, oppure un soggiorno di una settimana a Vienna offerta dall’organizzazione
turistica B.
Di ogni pacchetto offerto occorre conoscere modalità e prezzi; di ogni località o nazione è
opportuno tenere memorizzate informazioni su condizioni climatiche, moneta, ecc.
Un cliente può naturalmente acquistare in date diverse molti viaggi o vacanze.
Definire il modello del database e rappresentare le seguenti interrogazioni:
• Elenco dei viaggi/vacanza con prezzo inferiore a un prezzo prefissato.
• Elenco dei soggiorni con prezzo in una località prefissata.
• Elenco dei clienti, con nome e indirizzo, che hanno fatto un viaggio con una determinata
destinazione.
• Numero dei pacchetti offerti da un’organizzazione turistica prefissata.
• Elenco di tutte le nazioni o località con il numero di pacchetti che si riferiscono ad esse.
ANALISI DEI DATI
Le entità che possono essere individuate nel problema sono:
• Nazione, per rappresentare gli stati o le località che sono destinazioni dei pacchetti di
vacanze;
• Organizzazione, per le società di turismo che offrono i viaggi e i soggiorni di vacanze;
• Cliente, per l’anagrafica dei clienti dell’agenzia di viaggi;
• Pacchetto, per rappresentare i pacchetti di viaggio o soggiorno.
© Istituto Italiano Edizioni Atlas
285
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Gli attributi di Nazione sono: codice della nazione o località, denominazione più dettagliata
dello stato o della località di destinazione, moneta, clima.
Gli attributi di Organizzazione sono: codice dell’organizzazione, nome, telefono.
Gli attributi di Cliente sono: codice del cliente, cognome e nome, indirizzo, telefono.
Gli attributi di Pacchetto sono: codice del pacchetto, descrizione, modalità, prezzo.
Tra l’entità Nazione e l’entità Pacchetto esiste un’associazione uno a molti perché ci
possono essere più viaggi tra quelli offerti che hanno come destinazione una certa nazione
o località.
Tra l’entità Organizzazione e Pacchetto si stabilisce un’associazione uno a molti, perché
una stessa organizzazione può offrire molti pacchetti, però ogni pacchetto deve essere
inteso come un’offerta che per le sue caratteristiche è riferita a una precisa organizzazione,
anche se ha come destinazione una località comune ad altri pacchetti.
Tra l’entità Pacchetto e l’entità Cliente esiste un’associazione molti a molti, perché nel
testo del problema si dice che un cliente può acquistare in date diverse più viaggi o
vacanze e naturalmente lo stesso pacchetto viene acquistato da più clienti.
MODELLO E/R
Organizzazione
CodiceOrg {PK}
NomeOrg
TelefonoOrg
1
N
Offrire
Pacchetto
N
CodicePac {PK}
Descrizione
Modalità
Prezzo
N
N
Acquistare
Cliente
CodiceCli {PK}
Cognome
Nome
Indirizzo
Telefono
Essere
destinazione
1
Nazione
CodiceNaz {PK}
Denominazione
Moneta
Clima
Il modello viene verificato utilizzando le regole di lettura:
Ogni organizzazione può offrire uno o più pacchetti, ogni pacchetto deve essere offerto da
una sola organizzazione.
Ogni nazione o località può essere destinazione di uno o più pacchetti, ogni pacchetto deve
avere destinazione in una sola nazione o località.
Ogni pacchetto può essere acquistato da uno o più clienti, ogni cliente può acquistare uno
o più pacchetti.
Utilizzando le regole di derivazione si passa dal modello concettuale al modello logico, cioè
alle tabelle: le associazioni uno a molti si rappresentano introducendo le chiavi esterne
nella tabella Pacchetti per indicare l’organizzazione proponente e la nazione o località di
destinazione.
286
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
L’associazione molti a molti genera una nuova tabella Acquisti. Essa ha come chiave un
numero progressivo di registrazione e contiene le chiavi di Pacchetti e Clienti più eventuali
attributi dell’associazione, per esempio la data in cui il cliente ha acquistato il pacchetto.
TABELLE
Nazioni (CodiceNaz, Denominazione, Moneta, Clima)
Clienti (CodiceCli, Cognome, Nome, Indirizzo, Telefono)
Organizzazioni (CodiceOrg, NomeOrg, TelefonoOrg)
Pacchetti (CodicePac, Descrizione, Modalità, Prezzo, CodiceNaz, CodiceOrg)
Acquisti (NumReg, CodiceCli, CodicePac, DataAcquisto)
Lo schema seguente illustra le caratteristiche degli attributi delle tabelle.
Tabella
Attributo
Chiave
Formato
Nazioni
CodiceNaz
Denominazione
Moneta
Clima
PK
carattere
carattere
carattere
carattere
Clienti
CodiceCli
Cognome
Nome
Indirizzo
Telefono
PK
numerico (intero)
carattere (30)
carattere (20)
carattere (25)
carattere (12)
sì
sì
no
no
sì
Organizzazioni
CodiceOrg
NomeOrg
TelefonoOrg
PK
carattere (4)
carattere (30)
carattere (12)
sì
sì
no
Pacchetti
CodicePac
Descrizione
Modalità
Prezzo
CodiceNaz
CodiceOrg
PK
carattere (5)
carattere (50)
carattere (40)
numerico (2 decimali)
carattere (3)
carattere (4)
sì
sì
no
no
sì
sì
NumReg
CodiceCli
CodicePac
DataAcquisto
PK
FK
FK
numerico (autoinc)
numerico (intero)
carattere (5)
data/ora
sì
sì
sì
no
Acquisti
FK
FK
Indicizzato
(3)
(20)
(15)
(30)
sì
sì
no
no
INTERROGAZIONI
Elenco dei viaggi/vacanza con prezzo inferiore a un prezzo prefissato.
1. σP Pacchetti
Selezione di Pacchetti per Prezzo < [prezzo massimo]
SELECT *
FROM Pacchetti
WHERE Prezzo < [prezzo massimo];
© Istituto Italiano Edizioni Atlas
287
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Elenco dei soggiorni con prezzo in una località prefissata.
1. σP Nazioni
2. Temp1PK
PacchettiFK
3. ΠL Temp2
Temp1 = Selezione di Nazioni per Denominazione = [località]
Temp2 = Congiunzione di Temp1 e Pacchetti su CodiceNaz
Proiezione di Temp2 su Descrizione, Modalità, Prezzo
SELECT Descrizione, Modalità, Prezzo
FROM Nazioni, Pacchetti
WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz AND
Denominazione = [località prefissata];
Elenco dei clienti, con cognome, nome e indirizzo, che hanno fatto un viaggio con una
determinata destinazione.
1. σP Nazioni
2. Temp1PK
Temp1 = Selezione di Nazioni per Denominazione = [località]
PacchettiFK
Temp2 = Congiunzione di Temp1 e Pacchetti su CodiceNaz
3. Temp2PK
AcquistiFK
Temp3 = Congiunzione di Temp2 e Acquisti su CodicePac
4. Temp3FK
ClientiPK
Temp4 = Congiunzione di Temp3 e Clienti su CodiceCli
5. ΠL Temp4
Proiezione di Temp4 su Cognome, Nome, Indirizzo
SELECT Cognome, Nome, Indirizzo
FROM Nazioni, Pacchetti, Acquisti, Clienti
WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz AND
Pacchetti.CodicePac = Acquisti.CodicePac AND
Acquisti.CodiceCli = Clienti.CodiceCli AND
Denominazione = [località da controllare];
Numero dei pacchetti offerti da un’organizzazione turistica prefissata.
1. σP Organizzazioni
Temp1 = Selezione di Organizzazioni per NomeOrg = [organizzazione]
2. Temp1PK
Temp2 = Congiunzione di Temp1 e Pacchetti su CodiceOrg
PacchettiFK
3. ΠL Temp2
Proiezione di Temp2 su conteggi
SELECT COUNT(*) AS Numero
FROM Pacchetti, Organizzazioni
WHERE Pacchetti.CodiceOrg = Organizzazioni.CodiceOrg AND
NomeOrg = [organizzazione da controllare];
Elenco di tutte le nazioni o località con il numero di pacchetti che si riferiscono ad esse.
1. NazioniPK
PacchettiFK
Temp1 = Congiunzione di Nazioni e Pacchetti su CodiceNaz
2.
Temp2 = Raggruppamento di Temp1 per Denominazione Conteggio
3. ΠL Temp2
Proiezione di Temp2 su Denominazione, conteggio
SELECT Denominazione, COUNT(*) AS Numero
FROM Nazioni, Pacchetti
WHERE Nazioni.CodiceNaz = Pacchetti.CodiceNaz
GROUP BY Denominazione;
288
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
ESEMPIO CON QUERY NIDIFICATE E CONDIZIONI SUI RAGGRUPPAMENTI
PROGETTO 7
Rappresentanti e fatture ai clienti
Si vogliono organizzare le informazioni relative ai clienti, ai loro rappresentanti e alle fatture
emesse. Ogni rappresentante ha tanti clienti, mentre a un cliente corrisponde un solo
rappresentante. Per semplicità si supponga di registrare solo la data e l’importo totale di
ogni fattura, senza specificare le righe di dettaglio sugli articoli venduti.
Definire il modello del database e rappresentare le seguenti interrogazioni:
• Elenco dei clienti di un rappresentante.
• Numero dei clienti affidati a un determinato rappresentante.
• Cognome e nome del rappresentante di un determinato cliente.
• Elenco delle fatture di un codice cliente prefissato, in ordine di data.
• Fatturato raggruppato per codice rappresentante.
• Numero delle fatture emesse raggruppate per codice rappresentante.
• Nome del cliente e data di emissione per la fattura con importo massimo.
• Nome del rappresentante corrispondente alla fattura con importo massimo.
• Codice e nome dei clienti per i quali il fatturato totale è superiore a un valore prefissato.
• Codice e nome dei rappresentanti per i quali il numero delle fatture è superiore a un
numero prefissato.
ANALISI DEI DATI
Le entità che possono essere individuate nel problema sono:
• Cliente, per i clienti ai quali vengono emesse le fatture;
• Rappresentante, per gli agenti ai quali sono assegnati i clienti;
• Fattura, per le vendite effettuate dai rappresentanti.
Gli attributi di Cliente sono: codice del cliente, ragione sociale, indirizzo, telefono, partita IVA.
Gli attributi di Rappresentante sono: codice del rappresentante, cognome, nome, zona
assegnata.
Gli attributi di Fattura sono: numero della fattura, data di emissione, importo.
Tra l’entità Cliente e l’entità Fattura esiste un’associazione uno a molti, perché per lo stesso
cliente possono essere emesse molte fatture, ma ciascuna fattura è ricevuta da un solo
cliente.
Tra l’entità Rappresentante e l’entità Cliente si stabilisce un’associazione uno a molti perché
ogni rappresentante ha tanti clienti, mentre a un cliente corrisponde un solo rappresentante.
I dati del problema considerato si rappresentano graficamente con il seguente schema
Entity/Relationship:
MODELLO E/R
Fattura
N
1
Ricevere
NumeroFatt {PK}
DataFatt
Importo
© Istituto Italiano Edizioni Atlas
Cliente
CodiceCli {PK}
RagioneSociale
Indirizzo
Telefono
PartitaIVA
N
1
Visitare
Rappresentante
CodiceRap {PK}
CognomeRap
NomeRap
Zona
289
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Il modello viene verificato utilizzando le regole di lettura:
Ogni rappresentante può visitare uno o più clienti, ogni cliente deve essere visitato da un
solo rappresentante.
Ogni cliente può ricevere una o più fatture, ogni fattura deve essere ricevuta da un solo cliente.
Utilizzando le regole di derivazione si passa dal modello concettuale alle tabelle, introducendo le chiavi esterne per rappresentare le associazioni uno a molti.
TABELLE
Rappresentanti (CodiceRap, CognomeRap, NomeRap, Zona)
Clienti (CodiceCli, RagioneSociale, Indirizzo, Telefono, PartitaIVA, CodiceRap)
Fatture (NumeroFatt, DataFatt, Importo, CodiceCli)
Le caratteristiche degli attributi delle tabelle sono illustrate nello schema seguente:
Tabella
Attributo
Rappresentanti
CodiceRap
CognomeRap
NomeRap
Zona
PK
carattere (4)
carattere (30)
carattere (20)
numerico (intero)
sì
sì
no
no
Clienti
CodiceCli
RagioneSociale
Indirizzo
Telefono
PartitaIVA
CodiceRap
PK
carattere
carattere
carattere
carattere
carattere
carattere
sì
sì
no
no
no
sì
NumeroFatt
DataFatt
Importo
CodiceCli
PK
Fatture
Chiave
FK
FK
Formato
Indicizzato
(5)
(40)
(30)
(12)
(11)
(4)
numerico (autoinc)
data/ora
numerico (2 decimali)
carattere (5)
sì
no
no
sì
INTERROGAZIONI
Elenco dei clienti di un rappresentante.
1. σP Rappresentanti
2. Temp1PK
ClientiFK
3. ΠL Temp2
Temp1 = Selezione di Rappresentanti per CognomeRap = [cognome]
Temp2 = Congiunzione di Temp1 e Clienti su CodiceRap
Proiezione di Temp2 su RagioneSociale, Indirizzo, Telefono
SELECT RagioneSociale, Indirizzo, Telefono
FROM Clienti, Rappresentanti
WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND
CognomeRap = [rappresentante da controllare];
Numero dei clienti affidati a un determinato rappresentante.
1. σP Rappresentanti
2. Temp1PK
ClientiFK
3.
Temp1 = Selezione di Rappresentanti per CognomeRap = [cognome]
Temp2 = Congiunzione di Temp1 e Clienti su CodiceRap
Conteggio delle righe di Temp2
SELECT COUNT(*) AS NumeroClienti
FROM Clienti, Rappresentanti
WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND
CognomeRap = [rappresentante da controllare];
290
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Cognome e nome del rappresentante di un determinato cliente.
1. σP Clienti
2. Temp1FK
3. ΠL Temp2
Temp1 = Selezione di Clienti per RagioneSociale = [cliente]
RappresentantiPK Temp2 = Congiunzione di Temp1 e Rappresentanti su CodiceRap
Proiezione di Temp2 su CognomeRap, NomeRap
SELECT CognomeRap, NomeRap
FROM Clienti, Rappresentanti
WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND
RagioneSociale = [cliente da controllare];
Elenco delle fatture di un codice cliente prefissato in ordine di data.
1. σP Fatture
2. ΠL Temp2
Temp1 = Selezione di Fatture per CodiceCli = [codice cliente]
Proiezione di Temp2 su tutti i campi ordinato per data fattura
SELECT *
FROM Fatture
WHERE CodiceCli = [codice da controllare]
ORDER BY DataFatt;
Fatturato raggruppato per codice rappresentante.
1. ClientiPK
2.
3. ΠL Temp2
FattureFK Temp1 = Congiunzione di Clienti e Fatture su CodiceCli
Temp2 = Raggruppamento di Temp1 per CodiceRap e calcolo somma
Importo
Proiezione di Temp2 su CodiceRap, Somma
SELECT CodiceRap, SUM(Importo) AS Fatturato
FROM Fatture, Clienti
WHERE Fatture.CodiceCli = Clienti.CodiceCli
GROUP BY CodiceRap;
Numero delle fatture emesse raggruppate per codice rappresentante.
1. ClientiPK
2.
3. ΠL Temp2
FattureFK Temp1 = Congiunzione di Clienti e Fatture su CodiceCli
Temp2 = Raggruppamento di Temp1 per CodiceRap e Conteggio
Proiezione di Temp2 su CodiceRap, conteggio
SELECT CodiceRap, COUNT(*) AS NumeroFatture
FROM Fatture, Clienti
WHERE Fatture.CodiceCli = Clienti.CodiceCli
GROUP BY CodiceRap;
Nome del cliente e data di emissione per la fattura con importo massimo.
1.
2. σP Fatture
3. ClientiPK
4. ΠL Temp2
Temp1FK
Max = Valore massimo importo fatture
Temp1 = Selezione di Fatture per Importo = Max
Temp2 = Congiunzione di Clienti e Temp1 su CodiceCli
Proiezione di Temp2 su RagioneSociale, DataFatt, Importo
SELECT RagioneSociale, DataFatt, Importo
FROM Fatture, Clienti
WHERE Fatture.CodiceCli = Clienti.CodiceCli AND
Importo = (SELECT MAX(Importo)
FROM Fatture);
© Istituto Italiano Edizioni Atlas
291
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Cognome e nome del rappresentante corrispondente alla fattura con importo massimo.
1.
Max = Valore massimo importo fatture
2. σP Fatture
3. ClientiPK
Temp1 = Selezione di Fatture per Importo = Max
Temp2 = Congiunzione di Clienti e Temp1 su CodiceCli
Temp1FK
4. RappresentantiPK
Temp2FK
5. ΠL Temp3
Temp3 = Congiunzione di Rappresentanti e Temp2 su CodiceRap
Proiezione di Temp3 su CognomeRap, NomeRap
SELECT CognomeRap, NomeRap
FROM Fatture, Rappresentanti, Clienti
WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND
Fatture.CodiceCli = Clienti.CodiceCli AND
Importo = (SELECT MAX(Importo)
FROM Fatture);
Codice e ragione sociale dei clienti per i quali il fatturato totale è superiore a un valore
prefissato.
1. ClientiPK
FattureFK Temp1 = Congiunzione di Clienti e Fatture su CodiceCli
2.
Temp2 = Raggruppamento di Temp1 per cliente e Somma importi
3.
Temp3 = Selezione di Temp2 per Somma importi > [cifra prefissata]
4. ΠL Temp3
Proiezione di Temp3 su CodiceCli, RagioneSociale
SELECT CodiceCli, RagioneSociale
FROM Fatture, Clienti
WHERE Clienti.CodiceCli = Fatture.CodiceCli
GROUP BY CodiceCli, RagioneSociale
HAVING SUM(Importo) > [cifra prefissata];
Codice con cognome e nome dei rappresentanti per i quali il numero delle fatture è
superiore a un numero prefissato.
1. RappresentantiPK
2. Temp1PK
3.
ClientiFK
FattureFK
Temp1 = Congiunzione di Rappresentanti e Clienti su CodiceRap
Temp2 = Congiunzione di Temp1 e Fatture su CodiceCli
Temp3 = raggruppamento di Temp2 per rappresentante e
Conteggio
4.
Temp4 = Selezione di Temp3 per Conteggio > [numero prefissato]
5. ΠL Temp4
Proiezione di Temp4 su CodiceRap, CognomeRap, NomeRap
SELECT CodiceRap, CognomeRap, NomeRap
FROM Fatture, Rappresentanti, Clienti
WHERE Clienti.CodiceRap = Rappresentanti.CodiceRap AND
Fatture.CodiceCli = Clienti.CodiceCli
GROUP BY CodiceRap, CognomeRap, NomeRap
HAVING COUNT(*) > [numero prefissato];
292
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
13 I comandi per la sicurezza
L’amministratore della base di dati, o comunque chi crea il database, può stabilire anche il
diritto di accesso per utenti specifici o per tutti gli utenti, nel caso di accessi multipli alle tabelle
del database.
Il comando GRANT concede i permessi, specificando il tipo di accesso, per le tabelle sulle quali
è consentito l’accesso e l’elenco degli utenti ai quali è permesso di accedere. Il tipo di accesso
può riguardare, per esempio, il diritto di modifica della struttura della tabella con l’aggiunta di nuove
colonne, oppure di modifica dei dati contenuti nella tabella, oppure l’uso del comando Select.
Per concedere il diritto di modifica sulla tabella Impiegati agli utenti denominati con User1 e
User2, si deve usare il comando Grant nella forma:
GRANT UPDATE
ON Impiegati
TO User1, User2;
La revoca dei permessi con annullamento dei diritti di accesso viene effettuato con il comando
REVOKE che ha una sintassi analoga a quella del comando Grant:
REVOKE UPDATE
ON Impiegati
FROM User1, User2;
I permessi che possono essere concessi (o revocati) agli utenti sono indicati con le seguenti
parole chiave che vanno specificate dopo Grant o Revoke:
ALTER
per aggiungere o eliminare colonne, oppure per modificare i tipi di dati
DELETE
per eliminare righe dalle tabelle
INDEX
per creare indici
INSERT
per inserire nuove righe nelle tabelle
SELECT
per ritrovare i dati dalle tabelle
UPDATE
per cambiare i valori contenuti nelle tabelle
ALL
per tutti i permessi precedenti.
I permessi con le opzioni Select e Update, nei comandi Grant e Revoke, diventano più restrittivi
specificando, tra parentesi tonde e separati con la virgola, i nomi delle colonne che l’utente può
vedere o modificare.
Per concedere il diritto di modifica della residenza e dello stipendio degli impiegati all’utente
denominato con User3, si deve usare il comando Grant nella forma:
GRANT UPDATE (Residenza, Stipendio)
ON Impiegati
TO User3;
AUTOVERIFICA
Domanda 15 pag. 296
Problemi da 37 a 39 pag. 298 e da 73 a 75 pag. 300
Problemi di riepilogo da 76 a 79 pag. 300-301
ERIA
EB
W
LIBR
I permessi e i diritti di accesso possono riguardate, non solo le tabelle, ma anche le viste create
con il comando Create View. I sottoschemi e le autorizzazioni per utenti diversi su un database
relazionale possono essere quindi definiti in pratica con il linguaggio SQL, usando in modo
combinato i comandi Create View e Grant.
4. I trigger
© Istituto Italiano Edizioni Atlas
293
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
DOMANDE
ATTIVITÀ DI AUTOVERIFICA
Creazione del database e delle tabelle
1
Completa le frasi seguenti utilizzando una tra le parole elencate alla fine della domanda.
a) per eliminare una tabella dal database si usa il comando .........
b) per modificare i valori nelle righe di una tabella si usa il comando .........
c) per inserire nuove tabelle nel database si usa il comando .........
d) per aggiungere una colonna a una tabella si usa il comando .........
Insert, Select, Create Table, Update, Alter Table, Delete, Drop Table
2
Determina il tipo di linguaggio per ciascuno dei comandi SQL elencati nella colonna di
sinistra.
comando
tipo di linguaggio: DDL, DML, QL (Query Language)
a) INSERT
..............
b) CREATE TABLE
..............
c) UPDATE
..............
d) ALTER TABLE
..............
e) DELETE
..............
Operazioni relazionali con il linguaggio SQL
294
3
Quale delle seguenti frasi SQL estrae i valori di A1 nelle righe di Tabella con A2 = 5?
a) Select A1, A2=5 From Tabella
b) Select A2=5 From Tabella.A1
c) Select A1 From Tabella Where A2 = 5
d) Select Tabella.A1 From Tabella.A2 = 5
4
Quale delle seguenti frasi SQL estrae le righe di Tabella prive di valori in A2?
a) Select ALL From Tabella Where A1 = ‘ ‘
b) Select * From Tabella Where A2 Is Null
c) Select Tabella.* From Tabella Where A1 = ‘ ‘
d) Select A1 From Tabella With A2 Null
5
Quale delle seguenti frasi SQL rappresenta meglio una proiezione?
a) Select A1, A2 From Tabella1 Where K1 > 10
b) Select * From Tabella1, Tabella2 Where K1 = K2
c) Select A1, A2 From Tabella1
d) Select * From Tabella1 Where A1 = ‘xyz’
6
Quale delle seguenti frasi SQL contiene una selezione?
a) Select * From Tabella1
b) Select * From Tabella1, Tabella2 Where K1 = K2
c) Select A1 = A2 From Tabella1
d) Select * From Tabella1 Where A1 = ‘xyz’
7
Quale delle seguenti frasi SQL rappresenta meglio una congiunzione?
a) Select * From Tabella1, Tabella2 Where K1 = K2
b) Select A1, A2 From Tabella1
c) Select A1, A2, K1 From Tabella1, Tabella2 Where K1 = K2 And A1 = ‘xyz’
d) Select * From Tabella2 Where A1 = ‘xyz’
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
8
capitolo 6
Il linguaggio SQL
Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
a) Il left join si può realizzare in SQL, ma non nell’SQL di Access
b) Il left join è una congiunzione di scarsa utilità
c) Nelle interrogazioni che riguardano un’entità sulla quale è stata stabilita
un’associazione ricorsiva può essere necessario il self join
d) Un self join tra tabelle si realizza con il comando: Self Join
V F
V F
V F
V F
Funzioni di aggregazione, ordinamenti, raggruppamenti
9
Quali delle seguenti frasi SQL sono sintatticamente corrette (V) e quali sono errate (F)?
Select
Select
Select
Select
SUM (Num1 * Num2) AS ‘Totale’ From Tabella;
Tabella Where AVG(Importo) > 100;
Count (Num1) AS Conteggio From Tabella Where Nome = ‘ABCD’;
Nome, Num1 From Tabella Group By Nome;
V F
V F
V F
ATTIVITÀ DI AUTOVERIFICA
a)
b)
c)
d)
V F
10 Quali delle seguenti frasi SQL elenca il totale delle fatture suddivise per cliente?
e)
b)
c)
d)
Select
Select
Select
Select
Cliente, SUM(Importo) From TabellaFatture Group By Importo;
Cliente, SUM (Importo) From TabellaFatture Order By Cliente;
ORDER (Cliente, Importo ) From TabellaFatture;
Cliente, SUM (Importo) From TabellaFatture Group By Cliente;
11 Quale delle seguenti frasi SQL consente di ottenere il nome delle città da cui provengono più
di 10 studenti?
a) Select Studenti From Città
b) Select Studenti From Città
c) Select Città From Studenti
d) Select Città From Studenti
Group
Group
Group
Group
By
By
By
By
Città
Città
Città
Città
Having COUNT(*) > 10;
Where COUNT(*) > 10;
Having COUNT(*) > 10;
Where COUNT(*) > 10;
12 Quale delle seguenti frasi SQL consente di ottenere il numero degli studenti che provengono
da
a)
b)
c)
d)
una città prefissata?
Select COUNT(*) From
Select COUNT(*) From
Select COUNT(*) From
Select COUNT(*) From
Studenti
Studenti
Studenti
Studenti
Group By [Città prefissata];
Where Città = [Città prefissata];
Group By Città Where Città = [Città prefissata];
Having Città = [Città prefissata];
13 Associa a ciascun predicato della colonna di sinistra la funzione da esso svolta nelle condizioni di ricerca scegliendo tra quelle elencate a destra:
a) BETWEEN
1) controlla se un valore appartiene a un insieme specificato di valori
b) IN
2) confronta il valore in una colonna con il valore nullo
c) LIKE
3) controlla se un valore è compreso in un intervallo di valori
d) IS NULL
4) confronta il valore di un attributo con un modello di stringa
14 Quale delle seguenti frasi SQL consente di ottenere il numero della fattura di importo massimo?
a)
b)
c)
d)
Select
Select
Select
Select
NumFattura, MAX(Importo) From Fatture;
NumFattura From Fatture Where Importo = MAX(Importo);
NumFattura From Fatture Having Importo = MAX(Importo);
NumFattura From Fatture Where Importo = (Select MAX(Importo) From Fatture);
© Istituto Italiano Edizioni Atlas
295
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Comandi per la sicurezza
15 Quali delle seguenti affermazioni sono vere (V) e quali false (F)?
a) Il comando GRANT crea una vista parziale sulle tabelle del database
b) L’annullamento dei permessi agli utenti per l’accesso alle tabelle viene effettuato
con il comando REVOKE
c) La vista consente di decidere le modalità con le quali gli utenti possono vedere
Le tabelle del database
d) Il comando GRANT UPDATE concede permessi di variazione sui dati
V F
V F
V F
V F
PROBLEMI
ATTIVITÀ DI AUTOVERIFICA
Gli esercizi proposti consistono nel costruire il progetto del database attraverso il modello E/R e
la derivazione delle tabelle; inoltre devono essere formalizzate le interrogazioni attraverso la
pseudocodifica e il linguaggio SQL. Per ciascun problema le interrogazioni sono di difficoltà
crescente e richiedono l’utilizzo di operatori, funzioni e predicati del linguaggio SQL: quindi
possono essere svolte anche in tempi successivi per lo stesso esercizio con il procedere dello studio
del linguaggio SQL.
PROBLEMA 1
Costruire il modello dei dati per organizzare le informazioni sui redditi dei dipendenti e le aziende
dove lavorano. I dipendenti effettuano versamenti di imposta in date diverse durante l’anno.
Le entità del modello sono quindi Dipendente, Azienda e Versamento.
Tra gli attributi dei dipendenti, oltre ai dati anagrafici sono contenuti anche la professione, il
reddito annuo lordo, il numero dei familiari a carico, il totale delle trattenute effettuate. Negli
attributi dell’azienda, oltre alla denominazione, occorre inserire anche l’indirizzo e il settore di
attività. Definire il modello E/R e il modello logico con le tabelle.
Creazione del database e delle tabelle
1
2
Scrivere le istruzioni SQL per la creazione della tabella delle aziende.
Scrivere le istruzioni SQL per la creazione della tabella dei dipendenti, rendendo obbligatoria
l’immissione del nome e del cognome e dichiarando il campo della tabella che è messo in
corrispondenza con la chiave della tabella delle aziende.
Operazioni relazionali con il linguaggio SQL
Scrivere in pseudocodifica e in linguaggio SQL le seguenti interrogazioni.
296
3
4
5
6
7
Elenco dei dipendenti con matricola, cognome, nome, professione e reddito lordo.
8
Cognome e nome dei dipendenti di una determinata azienda che svolgono una professione
prefissata.
9
Lista delle differenti professioni presenti in un’azienda di cui si conosce il codice.
Denominazione e indirizzo dell’azienda avente un codice prefissato.
Cognome e nome dei dipendenti che hanno un reddito superiore a una cifra prefissata.
Denominazione e indirizzo delle aziende che hanno la sede in un Comune prefissato.
Cognome, nome, professione, reddito, per i dipendenti che svolgono una determinata professione e hanno il reddito inferiore a un valore prefissato.
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
10 Lista delle professioni, con eliminazione dei duplicati, per le quali i redditi sono superiori a
un valore prefissato.
11 Elenco dei versamenti, con data e importo, effettuati dai dipendenti di una determinata
azienda.
12 Ammontare dell’imposta lorda, calcolata sul reddito al netto delle trattenute secondo una
percentuale prefissata, per tutti i dipendenti che svolgono una determinata professione.
Funzioni di aggregazione, ordinamenti, raggruppamenti
Numero dei dipendenti che lavorano in un’azienda di cui si conosce la denominazione.
Valore minimo e massimo tra i redditi di tutti i dipendenti.
Valore medio dei redditi dei dipendenti con professione prefissata.
Somma dei versamenti di imposta effettuati dai dipendenti di un’azienda di cui si conosce
il codice.
ATTIVITÀ DI AUTOVERIFICA
13
14
15
16
17 Elenco alfabetico con i dati anagrafici di tutti i dipendenti.
18 Elenco alfabetico di tutte le aziende.
19 Elenco alfabetico dei dipendenti di un’azienda, con cognome, nome e reddito al netto delle
trattenute.
20 Elenco alfabetico dei dipendenti di un’azienda con cognome, nome e detrazioni totali spettanti in funzione dei familiari a carico, conoscendo il valore unitario della detrazione per ogni
familiare.
21 Elenco alfabetico con cognome, nome dei dipendenti e indirizzo dell’azienda dove lavorano.
22 Elenco dei dipendenti di un’azienda prefissata con cognome, nome, reddito lordo, somma
dei versamenti di imposta.
23 Per ciascuna azienda: denominazione, numero dei dipendenti, totale dei redditi.
24 Numero dei dipendenti e reddito medio per i dipendenti con una professione prefissata
raggruppati per azienda.
25 Valore medio dei versamenti di imposta raggruppati per azienda.
26 Cognome e nome dei dipendenti che lavorano presso una tra quattro aziende prefissate delle
quali si conoscono i codici.
27 Cognome e nome dei dipendenti che non sono né impiegati né dirigenti.
28 Cognome e professione dei dipendenti che hanno il cognome con iniziale dalla lettera A alla
lettera M.
29 Cognome, nome e professione dei dipendenti che hanno il reddito compreso tra due cifre
prefissate.
30 Numero dei dipendenti raggruppati per professione riferiti alle aziende che operano in uno
tra cinque settori di attività prefissati.
31 Lista delle aziende, con denominazione e valore medio dei versamenti di imposta, per le quali
il valore medio è superiore a un valore prefissato.
32 Lista delle aziende, con denominazione e numero dei dipendenti che svolgono una professione prefissata, per le quali il numero dei dipendenti calcolato è superiore a 10.
© Istituto Italiano Edizioni Atlas
297
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
33 Elenco delle professioni dei dipendenti per i quali il valore medio dei redditi è superiore a un
valore prefissato.
34 Elenco delle aziende, con codice, denominazione e numero di dipendenti, per le quali il
numero dei dipendenti è superiore a 20.
35 Cognome, nome e professione dei dipendenti per i quali il reddito è uguale al valore massimo
tra tutti i dipendenti.
36 Codice dell’azienda, cognome e nome dei dipendenti che hanno il reddito uguale al valore
minimo tra i dipendenti aventi una determinata professione.
Viste logiche
37 Visualizzare odice e denominazione dell’azienda (o delle aziende) con il maggior numero di
dipendenti.
38 Lista delle aziende, con denominazione e valore medio dei redditi nell’azienda, per le quali
ATTIVITÀ DI AUTOVERIFICA
il valore medio è inferiore al valore medio dei dipendenti di tutte le aziende.
39 Codice e denominazione dell’azienda (o delle aziende) con il minor numero di dipendenti.
PROBLEMA 2
Si vogliono gestire con una base di dati le informazioni necessarie a organizzare i corsi di recupero
in una scuola. Gli elementi caratterizzanti il problema sono: gli studenti, le materie, dove gli
studenti possono avere delle carenze, e i docenti che devono fare i corsi di recupero.
Gli studenti possono avere più materie carenti e in ogni materia ci possono essere più studenti
bisognosi di recupero. Il legame tra studente e materia è realizzato tramite il voto che lo studente
ha in quella materia e la data in cui questo voto è stato assegnato.
Ogni docente insegna una sola materia, ma la stessa materia può essere insegnata da più docenti.
Definire il modello E/R e il modello logico con le tabelle.
Creazione del database e delle tabelle
40 Scrivere le istruzioni SQL per la creazione delle tabelle degli studenti, delle materie e dei
docenti.
41 Scrivere le istruzioni SQL per la creazione della tabella dei voti, che rappresenta il legame tra
studenti e materie, rendendo obbligatoria l’immissione del voto e dichiarando i campi della
tabella che sono in corrispondenza con le tabelle degli studenti e delle materie.
Codifica delle operazioni relazionali con il linguaggio SQL
Scrivere in pseudocodifica e in linguaggio SQL le seguenti interrogazioni.
42
43
44
45
46
Elenco, con cognome e nome, degli studenti delle quinte classi.
Elenco dei voti ottenuti da uno studente di cui si conosce il codice.
Elenco dei docenti di uno studente di cui si conosce il codice.
Elenco dei docenti con descrizione della materia insegnata.
Elenco delle prove sostenute dagli studenti in una materia, della quale viene fornito il codice,
con cognome, nome e voto.
47 Cognome, nome e classe degli studenti che hanno ottenuto voti inferiori a 5 in una certa materia
di cui viene fornita la descrizione, facendo comparire ciascun studente una sola volta nell’elenco.
298
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
48 Elenco degli studenti di un docente, di cui si conosce il codice.
49 Elenco delle materie insegnate nella scuola, con descrizione della materia e dei dati dei
docenti che la insegnano.
Funzioni di aggregazione, ordinamenti, raggruppamenti
Media dei voti di Inglese di uno studente di cui si conosce il nome.
Numero degli studenti di una classe.
Numero degli studenti della scuola.
Miglior voto di Matematica nella classe terza.
Miglior voto e peggior voto di uno studente di cui si conosce il codice.
Elenco dei voti ottenuti da uno studente di cui si conosce il codice. L’elenco, con descrizione
della materia, data e voto, deve essere ordinato per materia e data.
ATTIVITÀ DI AUTOVERIFICA
50
51
52
53
54
55
56 Elenco degli studenti di un docente, di cui si conosce il cognome, ordinato per classe e per
cognome e nome dello studente.
57 Elenco alfabetico di tutti gli studenti con cognome, nome e numero delle prove sufficienti
in una determinata materia.
58 Elenco dei cognomi e nomi degli studenti di una certa classe con il numero delle prove con
voto inferiore a 5 di ciascun studente.
59 Elenco delle descrizioni delle materie con il numero di docenti per ogni materia.
60 Per ciascuna materia la descrizione e il numero delle prove svolte nel periodo tra 1 ottobre
e 15 novembre.
61 Numero delle prove che un determinato studente, di cui si conosce il cognome e nome, ha
sostenuto in ciascuna materia con la descrizione della materia.
62 Cognome, nome e classe degli studenti per i quali il cognome inizia con la lettera R.
63 Elenco alfabetico dei docenti che insegnano o lettere o matematica o inglese.
64 Cognome e nome degli studenti di una data classe che hanno voti compresi tra i valori di 7,5
e 10 in una materia fornita come parametro.
65 Elenco degli studenti, con nome, cognome e classe, che hanno ottenuto insufficienze in
matematica o informatica o fisica nel mese di aprile.
66 Elenco alfabetico dei docenti con la media dei voti assegnati per i quali la media è superiore a 5.
67 Elenco con cognome e nome degli studenti di una determinata classe che hanno il voto
minimo inferiore a 4.
68 Elenco con cognome e nome degli studenti di una determinata classe che hanno il voto
massimo superiore a 7.
69 Elenco dei docenti, con la materia di insegnamento, che hanno svolto più di 2 prove.
70 Descrizione delle materie nelle quali sono state effettuate più di 10 prove.
71 Cognome, nome e matricola degli studenti che non hanno insufficienze.
72 Cognome e mnome degli studenti che hanno più di un voto in Italiano.
© Istituto Italiano Edizioni Atlas
299
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Viste logiche
73 Visualizzare cognome, nome degli studenti di una classe che hanno la media dei voti di tutte
le prove inferiore alla media dei voti di tutte le prove per l’intera classe.
74 Cognome, nome e classe degli studenti che hanno ottenuto nelle prove di una materia un
voto uguale al massimo dei voti in quella materia di tutte le classi.
75 Sigla delle classi che hanno la media dei voti di tutti gli studenti in una materia (di cui viene
fornito il codice) inferiore alla media di tutti i voti in quella materia di tutta la scuola.
PROBLEMI DI RIEPILOGO
ATTIVITÀ DI AUTOVERIFICA
Per i seguenti problemi, produrre l’analisi dei dati con entità, attributi, associazioni, motivandone
le scelte; disegnare il modello E/R e verificarne la correttezza con le regole di lettura; definire le
tabelle con le regole di derivazione; descrivere le caratteristiche degli attributi nel modello logico;
scrivere infine le interrogazioni in pseudocodifica e in linguaggio SQL.
Utilizzare come riferimento gli esempi svolti nel paragrafo 12.
76 Date le tabelle:
Anagrafiche (Codice, Cognome, Nome, DataNascita, Indirizzo, Città, Provincia)
Immobili (CodImm, Collocazione, Tipo, Dimensione, CodProprietario)
Versamenti (ID, DataVers, Importo, CodAnag, CodImmobile)
(le chiavi primarie sono sottolineate, le chiavi esterne sono in corsivo) che rappresentano gli
importi versati dai proprietari di immobili per il pagamento delle imposte, produrre in
pseudocodifica e in linguaggio SQL le seguenti interrogazioni:
• Importo totale dei versamenti per una Provincia prefissata.
• Numero degli immobili raggruppati per Tipo.
• Cognome e Nome delle persone che posseggono più di 1 immobile.
• Codice degli immobili per i quali sono stati fatti versamenti con importo superiore a una
cifra prefissata.
• Elenco con Cognome, Nome del proprietario e Collocazione dell’immobile per un Tipo
prefissato.
• Numero delle persone raggruppate per Provincia tra quelle che posseggono un immobile
con Dimensione superiore a un valore prefissato.
• Cognome, Nome, Codice immobile riferiti ai versamenti effettuati tra due date prefissate.
• Media giornaliera degli importi dei versamenti per ciascuna data dei versamenti.
77 Le informazioni relative ai contratti dei giocatori con le società di calcio devono essere
organizzate in una base di dati. Le squadre possono naturalmente stipulare contratti con
molti giocatori; di solito un giocatore ha un contratto con una sola società; accade però
spesso anche il caso della comproprietà di un giocatore con squadre diverse a opera di più
contratti con i quali deve essere indicata anche la percentuale di possesso per ciascuna
società; in ogni caso il giocatore ha una sola squadra di cui indossa la maglia e in cui
effettivamente gioca.
Se per ciascun contratto venissero indicate la data di inizio e la data di scadenza, si potrebbe
anche sapere quali giocatori sono già occupati in una squadra, quali sono svincolati e quali
sono in comproprietà: nel primo caso un solo contratto ha la data di scadenza superiore alla
data odierna, nel secondo nessuno, nel terzo più di uno. Conservando nell’archivio tutti i
contratti degli anni precedenti, si possono anche avere informazioni sulla carriera di un
giocatore.
300
© Istituto Italiano Edizioni Atlas
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
Le interrogazioni da rappresentare sono:
• Per ogni squadra, visualizzare il codice della squadra e il numero dei giocatori con contratto in corso.
• Denominazione delle squadre che hanno più di 30 giocatori con contratto in corso.
• Dato il codice di un un giocatore, fornire l’elenco delle squadre (denominazione, data inizio,
data scadenza) con le quali ha avuto o ha contratti, cioè la carriera del giocatore.
• Cognome, nome e ruolo dei giocatori attualmente svincolati.
• Elenco dei giocatori (cognome, nome e squadra dove giocano) attualmente in comproprietà.
• Cognome, nome del giocatore e denominazione della squadra che attualmente ha in corso
il contratto con l’ingaggio più alto.
78 Si vuole gestire in modo automatizzato il servizio di fotocopiatura presso il Centro Stampa
ATTIVITÀ DI AUTOVERIFICA
di una scuola: ogni attività svolta (giorno, numero fotocopie, prezzo pagato) può essere
richiesta da un utente che può essere uno studente, un docente oppure una classe; si può
quindi usare un’unica anagrafica per gli utenti distinguendo tra studenti, docenti e classi
attraverso un campo di 1 carattere (con valori S, D, C). Le informazioni sugli utenti sono
minime (codice, descrizione, tipo, oltre a un riferimento: classe per gli studenti, sigla della
materia per i docenti, aula per le classi).
Le attività di fotocopiatura vengono svolte da operatori diversi e con macchine di stampa diverse.
Si devono poi realizzare le seguenti interrogazioni:
• Elenco delle attività svolte per i docenti di matematica (con giorno, numero fotocopie e prezzo).
• Nome degli operatori che hanno svolto attività di fotocopie usando la macchina con codice ABC.
• Elenco delle classi che hanno richiesto fotocopie in numero superiore a 100.
• Elenco dei docenti con la descrizione e la materia.
• Descrizione degli studenti che hanno fatto fotocopie, in numero superiore a un valore
prefissato, con l’operatore avente codice XYZ.
• Classi (con aula e numero fotocopie) che hanno richiesto il servizio nella giornata odierna.
79 Un’azienda di informatica gestisce un servizio di manutenzione sulle apparecchiature hardware
e software delle aziende clienti. Ciascun cliente può sottoscrivere diversi contratti di manutenzione, ciascuno dei quali ha una data di scadenza e un importo complessivo; inoltre ogni
contratto di manutenzione può riguardare diverse apparecchiature per ciascun cliente. Per
identificare le apparecchiature, ciascun cliente usa un numero di matricola: per ciascuna apparecchiatura occorre quindi usare una chiave composta codice cliente + matricola apparecchiatura.
Sulle apparecchiature, durante il periodo del contratto, vengono eseguiti diversi interventi di
assistenza (ogni intervento viene registrato con riferimento a una sola apparecchiatura); interessa anche conoscere il nome del tecnico che ha effettuato l’intervento; ogni tecnico naturalmente
può fare interventi su qualsiasi cliente e su qualsiasi apparecchiatura a seconda delle esigenze.
L’intervento ha una data di inizio (chiamata del cliente) e una data di fine (apparecchiatura
riparata e riconsegnata al cliente), che possono ovviamente anche coincidere. Se la data di
fine è nulla, significa che l’apparecchiatura è tuttora in riparazione.
Si devono realizzare le seguenti interrogazioni:
• Elenco degli interventi in corso (non completati) con descrizione, data di inizio e nome del
tecnico che li effettua.
• Totale degli importi dei contratti che scadono nell’ultimo trimestre dell’anno per ciascuna
azienda avente più di un contratto in manutenzione.
• Elenco delle ragioni sociali dei clienti con numero delle apparecchiature per ciascun cliente.
• Elenco delle ragioni sociali dei clienti che hanno richiesto interventi nel mese di febbraio.
• Elenco dei nomi dei tecnici che hanno effettuato interventi sulle apparecchiature del cliente
avente una ragione sociale prefissata.
• Elenco di tutti gli interventi effettuati su un’apparecchiatura avente un certo codice cliente
e un certo numero di matricola con descrizione, data inizio, e data fine.
• Elenco dei clienti con codice cliente e numero degli interventi effettuati per i clienti che
hanno la somma degli importi dei contratti inferiore a un valore prefissato.
© Istituto Italiano Edizioni Atlas
301
parte seconda
Ambienti software per i database
capitolo 6
Il linguaggio SQL
SCHEDA DI AUTOVALUTAZIONE
CONOSCENZE
Caratteristiche generali del linguaggio SQL
Comandi per la definizione del database e per le manipolazioni dei dati
Interrogazioni con il comando Select
Operazioni relazionali in SQL
Self join e join esterni
Funzioni di aggregazione
Ordinamenti e raggruppamenti
Condizioni sui raggruppamenti
Condizioni di ricerca
Viste logiche
Interrogazioni nidificate
Comandi per la sicurezza
ABILITÀ
Creare una tabella con i comandi SQL
Utilizzare la sintassi dei comandi Insert, Update e Delete
Codificare semplici query in SQL
Rappresentare le operazioni di selezione, proiezione e congiunzione
Rappresentare in SQL il self join e il left join
Usare le funzioni conteggio, somma, media, minimo e massimo
Usare le clausole Order by e Group by
Usare la clausola Having
Passare in Access dallo schema QBE alla Visualizzazione SQL e viceversa
Introdurre nelle query le condizioni con Between, In e Like
Definire le viste
Costruire query nidificate
Impostare permessi e diritti di accesso
DOMANDE PER LA PREPARAZIONE ALLA PROVA ORALE p. 533-534
SOLUZIONI AI QUESITI DI AUTOVERIFICA p. 537
302
© Istituto Italiano Edizioni Atlas