Complementi di Informatica Basi di Dati Leonardo Vanneschi

Complementi di Informatica
Basi di Dati
Leonardo Vanneschi
1
1. Introduzione ai Database
Al contrario dei dati utilizzati all'interno di un programma (come ad esempio le variabili, gli array,
le strutture dati dinamiche, ecc.), archivi (o file) e basi di dati (database) memorizzano dati in
maniera permanente (i dati rimangono in memoria anche in seguito alla terminazione di una data
applicazione o allo spegnimento della macchina).
Si definisce archivio l'insieme dei dati che vengono salvati su un supporto di memorizzazione
(disco). Un database è un archivio con una particolare struttura. In particolare, i database sono
formati da oggetti detti record. Un passo fondamentale (ma non l'unico) nella definizione di un
database consiste nella descrizione di come sono formati i record, ovvero il numero, il nome e i tipi
di dato che essi contengono, oltre ad altre informazioni complementari.
In altri termini, definire un database significa sia descrivere i dati che lo compongono, sia fornire
una definizione di questi dati (ad esempio, come sono organizzati, il loro significato, ecc.).
La principale differenza tra archivio e database, dunque, è la seguente:
•
Se si usano gli archivi, la definizione dei dati, del loro significato e del modo in cui sono
organizzati è parte integrante dell'applicazione:
•
Se si usano i database, la definizione della struttura dei dati è indipendente dall'applicazione:
All'interno di un database, ciò che svolge l'azione di interfaccia tra l'applicazione, i dati e la loro
definizione è il Database Management System (DBMS). Più in particolare, il DBMS è il sistema di
gestione del databse visto nel suo complesso: il DBMS si occupa di gestire interamente i dati,
compresa la loro definizione e il modo in cui essi vengono fisicamente archiviati.
2
2. Modello Entità-Relazione
Prima di implementare un'applicazione che fa uso di uno o più database, è bene scrivere ed aver
chiaro in mente il modello dei dati che si intende utilizzare. Un modello dei dati consiste in una
rappresentazione astratta delle strutture dei dati di un database. L'atto della creazione di un modello
dei dati prende il nome di modellazione dei dati o data modeling. La stragrande maggioranza delle
applicazioni esistenti che fanno uso dei database, esano un particolare tipo di modello per i dati,
noto con il nome di modello Entità-Relazione (E-R). Il suo nome deriva dal fatto che permette di
modellare il mondo reale utilizzando esclusivamente due concetti: entità e relazioni.
Le entità sono gli oggetti principali su cui vengono raccolte informazioni. Ogni entità del modello
E-R serve a rappresentare un concetto, concreto o astratto, del mondo reale. Quando si parla di
entità, una nozione molto importante da capire è quella di istanza di una entità. L'istanza di una
entità consiste in un singolo oggetto descritto dall'entità.
Esempio
Una entità potrebbe essere uno studente. In questo caso, una istanza di questa entità potrebbe essere
un particolare studente.
Dal precedente esempio, risulta chiaro che, al fine di poter definire delle istanze, e quindi avere a
disposizione degli oggetti precisi, occorre specificare in modo esatto come sono fatte le entità. In
generale, una entità è composta da una serie di attributi. Una particolare istanza di un attributo è
detta valore. I valori degli attributi devono permettere di distinguere tra le varie istanze delle entità.
Esempio
Prendiamo di nuovo in considerazione l'esempio precedente. Al fine di poter usare il concetto di
studente, e quindi poter caratterizzare particolari studenti, occorre specificare come vogliamo che
sia definito uno studente nell'applicazione. Un esempio tipico è il seguente: uno studente è definito
dalla seguente tripla: (nome, cognome, numero di matricola). A questo punto, una entità (ovvero un
particolare studente!) potrà essere, ad esempio: (Paolo, Rossi, 87364).
In questo esempio:
•
•
•
•
(nome, cognome, numero di matricola) è ciò che rappresenta l'entità studente all'interno del
programma. Si può anche dire che è l'entità studente.
(Paolo, Rossi, 87364) è un'istanza dell'entità studente.
nome è un attributo.
Paolo è un valore dell'attributo nome.
Si dice dominio di un attributo la collezione di tutti i valori possibili di quell'attributo.
Gli attributi possono essere classificati come chiavi o descrittori. Le chiavi identificano
univocamente una istanza di una entità. I descrittori, invece, descrivono una caratteristica non unica
di una entità.
3
Esempio
Nell'esempio precedente, più studenti possono avere lo stesso nome, lo stesso cognome, ma ogni
studente ha il suo numero di matricola, diverso da quello di tutti gli altri. Quindi, nell'esempio
precedente, il solo attributo che può essere una chiave per l'entità studente è l'attributo numero di
matricola.
Nel modello entità-relazione, un database è composto da diverse tabelle. Una tabella può contenere
svariate istanze di una (o più) entità.
Esempio
Ecco una possibile tabella studenti:
Nome
Paolo
Giovanni
Francesco
•
•
•
Cognome
Rossi
Bianchi
Verdi
Numero di Matricola
87364
53289
94362
Ogni riga di una tabella rappresenta una istanza di una entità.
Ogni colonna rappresenta un attributo dell'entità
Ogni posizione rappresenta un valore di un attributo.
Una relazione rappresenta un'associazione tra una o più entità. Una relazione è spesso
rappresentabile attraverso un verbo.
Esempi
Data l'entità studente e l'entità corso, uno studente può seguire uno o più corsi.
Data l'entità impiegato e l'entità progetto, gli impiegati vengono assegnati a un progetto.
Il grado di una relazione è il numero di entità associate alla relazione. La relazione n-aria è la forma
generale di grado n. I casi speciali sono quelli binari e ternari, dove i gradi sono, rispettivamente, 2
e 3. Le relazioni binarie, ovvero quelle tra due entità, sono le più comuni.
La cardinalità di una relazione descrive la mappa delle istanze delle entità associate nelle relazioni.
Il valore della cardinalità è uno o molti. I tipi principali di cardinalità per le relazioni sono:
•
•
•
Uno a uno.
Uno a molti.
Molti a molti.
4
Esempi
•
Relazione uno a uno: ogni studente ha un numero di matricola. In latri termini ad ogni
studente è associato uno e un solo numero di matricola e a ogni numero di matricola è
associato uno e un solo studente.
•
Relazione uno a molti: ogni impiegato appartiene a un Dipartimento. Ovvero, ogni
impiegato appartiene a uno e un solo dipartimento, ma ogni Dipartimento è formato da più
di un impiegato.
•
Relazione molti a molti: ogni studente deve dare gli esami. Ovvero, ogni studente deve dare
più di un esame ed ogni esame deve essere dato da più di uno studente.
Le relazioni possono essere rappresentate in modo grafico.
5
Un database nel modello Entità-Relazioni (o database relazionale) è composto da una o più tabelle
in relazione tra loro.
3. Chiavi e Attributi
Dicesi chiave primaria un attributo o un insieme di attributi che identificano univocamente una
specifica istanza di un'entità.
In caso di chiave primaria formata da più di un attributo, si parla di chiave composta.
Un attributo, per poter essere una chiave primaria, deve rispettare le seguenti proprietà:
•
•
•
Il valore deve essere specificato per ogni istanza dell'entità.
Il valore deve essere unico per ogni istanza dell'entità.
Il valore non deve cambiare o diventare nullo durante la vita di ogni istanza dell'entità.
La chiave primaria per ogni entità deve essere una e una sola (se più attributi possono, ognuno di
essi separatamente essere chiavi, occorre sceglierne uno).
Il concetto di chiave consente di esplicitare le relazioni tra le entità!
In particolare, è di notevole importanza il concetto di chiave esterna.
In una relazione tra una entità A e una entità B, l'entità A eredita l'intera chiave primaria dell'entità
B (o viceversa). Questa chiave, all'interno dell'entità B, si dice chiave esterna.
Una chiave esterna è un attributo che completa una relazione attraverso l'identificazione dell'entità
padre. Gli attributi di chiave esterna non sono considerati proprietà dell'entità in cui risiedono. Si
parla infatti di migrazione delle chiavi primarie.
6
Esempio
Si consideri la seguente relazione uno a molti:
Docente
Codice Fiscale (pk)
ID_Materia (fk)
Nome
Cognome
N
1
Materia
ID_Materia (pk)
Titolo del Corso
Anno
La chiave primaria ID_Materia dell'entità Materia (entità "padre") "migra" nell'entità Docente
(entità "figlio") come chiave esterna.
Si noti che le chiavi primarie vengono indicate con la sigla "pk" (primary key) mentre le chiavi
esterne con la sigla "fk" (foreign key).
4. Regole di inserzione e cancellazione
Visto che le tabelle dei database sono in relazione tra loro, e questa relazione è esplicitata dalla
condivisione di alcune chiavi, aggiungere o cancellare dati è un'operazione delicata. Dopo ogni
inserzione e/o cancellazione, infatti, il database deve comunque mantenere la sua integrità.
4.1. Regole di inserzione
Per spiegare queste regole, ci serviremo di un esempio: si supponga di avere a disposizione le
seguenti tabelle "Clienti" e "Fatture" in cui ogni cliente può ricevere una o più fatture e ogni fattura
può essere inviata da un solo cliente:
Clienti
Codice
Cliente
(pk)
100
110
120
130
140
150
160
Fatture
Nome
Paolo
Michele
Luigi
Sergio
Antonio
Renato
Claudio
Cognome
Rossi
Verdi
Bianchi
Grigi
Blu
Gialli
Arancioni
Numero
(pk)
1235
1236
1237
1238
1239
1240
Codice Cliente
(fk)
100
110
130
100
110
140
Importo
1000
1100
1200
1300
1400
1500
E supponiamo di voler inserire due nuove fatture nella tabella "Fatture":
Fattura 1:
1241 140 1010
Fattura 2:
1242 170 1020
7
Inserzione dipendente
Consente l'inserzione di un'istanza dell'entità figlio solo se la chiave padre esiste già.
Se si applica questa regola, la fattura 1 può essere inserita nella tabella Fatture, ma la fattura 2 no:
non esiste un cliente con codice 170 nella tabella clienti. La fattura 2 viene rifiutata.
Inserzione automatica
Permette l'inserzione di un'istanza figlio. Se l'istanza dell'entità padre non esiste, viene creata.
Se si applica questa regola, la fattura 1 viene inserita nella tabella Fatture senza alcun problema. La
fattura 2 viene inserita nella tabella Fatture e, dato che non esiste un cliente con codice 170 nella
tabella Clienti, questo nuovo cliente viene creato. Il valore di tutti i campi non chiave (nome e
cognome) viene messo a NULL.
Inserzione nulla
Consente l'inserzione di un'entità figlio. Se l'istanza padre non esiste, la chiave esterna nel figlio
viene impostata a NULL.
Se si applica questa regola, la fattura 1 viene inserita nella tabella Fatture senza alcun problema. La
fattura 2 viene inserita nella tabella Fatture, ma il valore dell'attributo codice cliente nella fattura 2
viene cambiato e viene messo a NULL.
Inserzione di default
Consente l'inserzione di un'entità figlio. Se l'istanza dell'entità padre non esiste la chiave esterna del
figlio viene impostata ad un valore predefinito.
Se si applica questa regola, la fattura 1 viene inserita nella tabella Fatture senza alcun problema. La
fattura 2 viene inserita nella tabella Fatture, ma il valore dell'attributo codice cliente nella fattura 2
viene cambiato e viene messo a un valore predefinito, che può essere uguale a NULL, o anche
uguale a un qualsiasi valore scelto "a priori".
Inserzione sempre permessa (o senza effetto)
Questa regola dice che l'inserzione di un'istanza dell'entità figlio è sempre consentita. Non è
richiesta in alcun modo l'esistenza dell'istanza padre e quindi non viene eseguito nessun controllo di
consistenza.
Se si applica questa regola, sia la fattura 1 che la fattura 2 sono inserite tali e quali nella tabella
Fatture. Deve essere il programma a gestire il fatto che non c'è un cliente con codice 170.
4.2. Regole di cancellazione
Per spiegare queste regole, consideriamo come esempio le tabelle Clienti e Fatture della pagina
precedente, ma supponiamo di voler cancellare dalla tabella clienti i seguenti clienti:
Cliente 1:
110 Michele Verdi
Cliente 2:
120 Luigi Bianchi
8
Cancellazione con Restrizione
Consente la cancellazione dell'istanza dell'entità padre solo se non ci sono istanze dell'entità figlio.
Se si applica questa regola, il cliente 1 non viene eliminato, perché nella tabella Fatture sono
presenti istanze con chiavi esterne uguali a 110. Il cliente 2, invece, viene eliminato perché nella
tabella Fatture non vi è alcun riferimento a esso.
Cancellazione a cascata
Permette sempre la cancellazione dell'entità padre e cancella tutte le istanze dell'entità figlio
corrispondente.
Se si applica questa regola, vengono eliminati sia il cliente 1 che il cliente 2 dalla tabella Clienti e
inoltre vengono cancellate tutte le fatture con chiave esterna uguale a 110 nella tabella Fatture.
Cancellazione nulla
Permette sempre la cancellazione dell'entità padre. Se esiste un'istanza dell'entità figlio, i valori
della chiave esterna per questa istanza sono impostati a NULL.
Con questa regola, vengono eliminati sia il cliente 1 che il cliente 2 dalla tabella Clienti e nella
tabella Fatture le chiavi esterne uguali a 110 vengono sostituite con il valore NULL.
Cancellazione di default
Permette sempre la cancellazione dell'entità padre. Se esiste un'istanza dell'entità figlio, i valori
della chiave esterna per questa istanza sono impostati a un valore predefinito.
Con questa regola, vengono eliminati sia il cliente 1 che il cliente 2 dalla tabella Clienti e nella
tabella Fatture le chiavi esterne uguali a 110 vengono sostituite con un valore predefinito, che può
essere NULL oppure un altro qualsiasi valore prefissato.
Cancellazione sempre permessa (o senza effetto)
Questa regola consente sempre la cancellazione. Non viene effettuato alcun controllo di
consistenza.
Se si applica questa regola, sia il cliente 1 che il cliente 2 vengono cancellati dalla tabella Clienti.
Deve essere il programma a gestire il fatto che non esistono più questi due clienti, che continuano
comunque a essere referenziati nella tabella Fatture.
Consigli
•
Evitare l'uso di inserzioni e cancellazioni nulle: generalmente l'entità padre in una relazione
deve esistere.
•
Usare la regola di inserzione automatica o dipendente: solo queste regole mantengono i dati
coerenti.
•
Usare la regola di cancellazione a cascata: questa regola assicura che si mantenga la
coerenza dei dati per le chiavi esterne.
9
5. Microsoft Access
5.1. Avvio
Per far partire MS Access da un qualsiasi PC con Windows XP occorre utilizzare il menu Start
nell'angolo in basso a sinistra dello schermo e selezionare:
Start --> Tutti i Programmi --> Microsoft Office --> Microsoft Office Access xxxx
(dove xxxx è l'anno di creazione del software, oppure la versione).
5.2. Creare un database
La prima operazione che occorre imparare con MS Access è creare un nuovo database. Per iniziare,
occorre prima di tutto creare un nuovo database vuoto.
Per fare questo, occorre:
•
Clickare sulla scritta "Crea un nuovo file" sulla parte destra dell'interfaccia di MS Access.
A questo punto, viene visualizzata una nuova interfaccia sulla parte destra della finestra. In questa
nuova interfaccia, occorre:
•
Clickare su "Database Vuoto" sotto il menu "Nuovo"
A questo punto, appare sullo schermo una finestra che serve per memorizzare sul PC il nuovo
database che state creando. Vi viene richiesto di dare un nome al database. In questa sezione, ci
serviremo di un esempio per spiegare il funzionamento di base di MS Access. Questo esempio
consiste nel creare ed eseguire semplici operazioni su un database che gestisce i conti correnti
10
bancari di alcuni clienti. Quindi, chiamiamo il database banca.mdb (mbd è l'estensione data per
default da MS Access al file contenente un database; questa estensione abbrevia le parole Microsoft
Data Base):
Infine, clickare sul bottone "Crea" per creare il database. Una volta creato il database, apparirà
sull'interfaccia principale di MS Access una nuova finestra, come mostrato dalla seguente figura:
E' tramite le funzionalità messe a disposizione su questa finestra che riusciremo a creare le tabelle
che faranno parte del nostro nuovo database.
11
5.3. Creare le tabelle
La finestra che è apparsa sullo schermo grazie all'operazione di creazione di un nuovo database
contiene le seguenti opzioni:
•
•
•
Creare una tabella in visualizzazione Struttura
Creare una tabella mediante una creazione guidata
Creare una tabella mediante l'immissione di dati
L'opzione più intuitiva, e anche quella che lascia all'utente la maggiore libertà nella scelta dei nomi
delle colonne (attributi o campi) e nei tipi di dato è quella che permette di creare una tabella in
visualizzazione Struttura. E' quest'ultima opzione che verrà utilizzata in questo corso.
Per iniziare la creazione di una tabella in visualizzazione Struttura, occorre semplicemente clickare
due volte sulla scritta "Creare una tabella in visualizzazione Struttura". In questo modo, appare sul
video una tabella vuota come mostra la seguente immagine:
Il nostro scopo sarà quello di creare due tabelle come le seguenti:
Customer Table
CustomerID
Name
Address
Number
Character
Character
City
State
Zip
Character Character Character
1001
Mr. Smith
123 Lexington
Smithville
KY
91232
1002
Mrs. Jones
12 Davis Ave.
Smithville
KY
91232
1003
Mr. Axe
443 Grinder Ln. Broadville GA
81992
1004
Mr. & Mrs. Builder 661 Parker Rd.
Streetville
GA
81990
12
Accounts Table
CustomerID AccountNumber AccountType DateOpened Balance
Number
Number
Character
Date
Number
1001
9987
Checking
10/12/1989
4000.00
1001
9980
Savings
10/12/1989
2000.00
1002
8811
Savings
01/05/1992
1000.00
1003
4422
Checking
12/01/1994
6000.00
1003
4433
Savings
12/01/1994
9000.00
1004
3322
Savings
08/22/1994
500.00
1004
1122
Checking
11/13/1988
800.00
Dove, la prima di queste due tabelle contiene le informazioni relative a un insieme di clienti
(Customers) mentre la seconda contiene le informazioni relative a un insieme di conti correnti
bancari (Accounts).
Cominciamo con la tabella "Customer Table". Occorre specificare che la tabella deve avere 6 campi
(colonne): Customer ID, Name, Address, City, State, Zip. Queste informazioni devono essere scritte
nella matrice che è apparsa sull'interfaccia di MS Access con l'ultima operazione che abbiamo fatto.
Per ogni campo, occorre specificare:
•
•
•
il nome (ad esempio, per il primo campo della tabella "Customer Table", CustomerID);
il tipo di dato (ad esempio, per il campo CustomerID potrebbe trattarsi di un numero);
una breve descrizione del significato di quel campo
Una volta fatte queste operazioni per la tabella "Customer Table", l'interfaccia dovrebbe avere, ad
esempio, il seguente aspetto:
13
A questo punto, occorre decidere quale dei campi appena definiti sia la chiave primaria per questa
tabella. In questo esempio, supponiamo di scegliere CustomerID come chiave primaria.
Per fare questo, occorre clickare con il bottone destro del mouse sul nome CustomerID (prima riga
della tabella). In questo modo, viene visualizzato un pop-up menu come nella figura seguente:
14
Da questo menu, selezionare "Chiave Primaria". Nella tabella, adesso, accanto al nome CustomerID
appare il simbolo di una chiave, che indica che la chiave primaria è stata assegnata, come si vede
nella figura seguente:
Per rimuovere la chiave primaria, occorrerebbe semplicemente ripetere questa operazione. Oppure,
per settare un altro campo come chiave primaria, semplicemente ripetere l'operazione sul nome di
un altro campo nella tabella.
A questo punto, la tabella "Customer Table" è pronta per essere salvata. Per fare questo, basta
semplicemente andare nel menu File della finestra di MS-Access e clickare su Save. Facendo ciò,
viene visualizzata una finestra come nella seguente figura:
15
Supponiamo di dare il nome "Customer" a questa tabella; poi basta clickare su "OK" e la tabella
viene salvata. Ci si accorge del fatto che la tabella è stata salvata perché nel banner della finestra
che contiene la tabella, adesso appare la scritta "Customer: Tabella" e non più "Tabella1: Tabella"
come nella figura qua sopra. A questo punto, clickare sulla croce su sfondo rosso in alto a destra
della finestra che contiene la tabella "Customer", per chiudere questa tabella.
Si noti che adesso, l'interfaccia principale di MS-Access ha l'aspetto mostrato nella seguente figura,
in altri termini, esiste un'icona per la tabella "Customer":
16
Per esercizio, "divertitevi" a creare esattamente nello stesso modo, la tabella "Accounts Table", a
cui darete il nome "Accounts". L'aspetto della tabella potrebbe essere, ad esempio, quello che
segue:
Si scelga il campo "AccountNumber" come chiave primaria di questa tabella, la si salvi e si chiuda
la finestra che la contiene. Se avete compiuto tutte le operazioni correttamente, dopo aver salvato la
tabella e chiuso la finestra che la contiene, l'interfaccia di MS-Access dovrebbe contenere anche
un'icona per la tabella "Accounts" come mostra la seguente figura:
17
A questo punto, le tabelle sono state create, ed hanno una struttura (ovvero contengono dei campi
ben precisi, con dei nomi e dei tipi ben definiti), ma sono ancora vuote (non c'è ancora nessun
cliente specifico nella tabella "Customer", ne' nessun conto corrente nella tabella "Accounts"). Per
aggiungere dati alle tabelle, si veda la prossima sezione.
5.4. Visualizzazione e Aggiunta di dati alle tabelle
Per poter aggiungere dati a una tabella, occorre aprirla, il che può essere fatto in due modi:
•
•
clickare due volte sul suo nome (o sulla sua icona) nell'interfaccia principale di MS-Access;
clickare una volta sul suo nome o sulla sua icona, in modo da evidenziarla, e poi clickare sul
bottone "Apri" della finestra che contiene il database ("banca" nel nostro esempio).
Supponiamo, ad esempio, di aver aperto la tabella "Customer". Verrà visualizzata un'interfaccia
come nella seguente figura:
Si noti che, in fondo alla finestra viene visualizzato il numero di record contenuti in questo istante
nella tabella. Dato che la tabella è appena stata creata, essa contiene un solo record, vuoto.
Per aggiungere i dati alla tabella, basta semplicemente scriverli nei rispettivi campi (colonne). Si
può usare il tasto TAB per passare da un campo al successivo. Supponiamo di aggiungere a questa
tabella i seguenti dati:
18
Per salvare i nuovi dati, basta selezionare "Save" dal menu "File".
Per eliminare un record, basta posizionarsi in uno dei suoi campi e selezionare "Modifica" -->
"Elimina record".
Per chiudere la tabella, basta clickare sulla croce con sfondo rosso nell'angolo in alto a destra della
finestra che la contiene.
Per esercizio, facciamo la stessa cosa anche per la tabella "Accounts", popolandola coi seguenti
dati:
19
5.5. Creare Relazioni tra Tabelle
E' chiaro che le due tabelle appena create sono legate dal fatto che esiste il campo CustomerID in
entrambe. Tramite MS-Access, è possibile rendere esplicita questa relazione.
Per fare questo, clickare sul menu "Strumenti" e selezionare "Relazioni".
Una volta fatto questo, appare sul video la seguente finestra:
Dato che si vuole una relazione tra la tabella "Customer" e la tabella "Accounts", ovvero una
relazione che coinvolga entrambe queste tabelle, selezioniamole entrambe e clickiamo su
"Aggiungi". Poi clickiamo su "Chiudi" nella stessa finestra. Appare sul video la seguente
interfaccia:
20
Per connettere la tabella "Customer" con la tabella "Accounts" in modo da formare una relazione,
clickare sul campo "CustomerID" della tabella "Customer" e trascinarlo (tenendo premuto il tasto
sinistro del mouse) sul campo "CustomerID" della tabella "Accounts". Una volta che si rilascia il
bottone sinistro del mouse, appare la seguente finistra:
21
In questa finestra, si vede che MS-Access ha "tentato" automaticamente di determinare il tipo di
relazione. In questo caso (come succede nella maggior parte dei casi), MS-Access ha identificato
questa relazione come una relazione "uno-a-molti". Infatti, ogni cliente può avere più di un conto
corrente, ma ogni conto corrente deve avere uno e un solo cliente.
MS-Access sapeva che il campo "CustomerID" della tabella "Customer" era chiave primaria per
questa tabella, e quindi ha scelto il lato della tabella "Customer" come lato "uno" della relazione
"uno-a-molti", mentre ha scelto il lato della tabella "Accounts" come lato "molti".
A questo punto, non rimane che clickare sull'opzione etichettata con la scritta "Applica integrità
referenziale" e clickare sul bottone "Crea"; in questo modo, la relazione verrà creata.
L'opzione "Applica integrità referenziale" permette a MS-Access di mettere dei vincoli importanti
sulle azioni che possono essere compiute e effettuare i controlli sul rispetto di questi vincoli. Ad
esempio, un record della tabella "Accounts" non potrà essere creato senza un valido "CustomerID"
e un record nella tabella "Customer" non potrà essere cancellato finché il cliente che stiamo
tentando di eliminare possiede ancora uno o più conti correnti nella tabella "Accounts".
Questi vincoli, in generale, sono molto importanti perché impediscono di creare situazioni ambigue
o senza senso (come un conto corrente posseduto da un cliente sconosciuto o situazioni analoghe).
Quindi, è sempre consigliato di clickare sull'opzione "Applica integrità referenziale" prima di creare
una relazione.
Una volta clickato su "Crea", l'interfaccia avrà il seguente aspetto:
Come possiamo vedere nella precedente figura, è stato creato un "link" tra le due tabelle, che
rappresenta graficamente l'avvenuta creazione della relazione.
22
Per chiudere la finestra "Relazioni", clickare sulla croce su sfondo rosso nell'angolo in alto a destra
di tale finestra e clickare su "Sì" nella finestra che domanda di salvare le modifiche effettuate al
layout "Relazioni".
5.6. Creare ed eseguire delle Query
Le query sono il meccanismo fondamentale per accedere le informazioni contenute nei database.
Una query può coinvolgere una o più tabelle. Per esempio, alcune query potrebbero essere:
•
•
•
Quali clienti vivono nello stato della Georgia?
Quali Account contengono meno di 5000$ ?
Qual'è il tipo di conto corrente che ogni cliente possiede?
E' chiaro che la prima di queste query riguarda solo la tabella "Customer", la seconda solo la tabella
"Accounts", ma la terza riguarda entrambe le tabelle e, per poter dare una risposta, occorre sfruttare
la relazione che abbiamo creato tra le due tabelle.
Trattiamo per prime le query che coinvolgono una sola tabella. Successivamente ci occuperemo di
quelle che coinvolgono più tabelle.
5.6.1. Query su Singole Tabelle
Con queste query è possibile, ad esempio:
•
•
•
Visualizzare solo alcuni particolari campi di una certa tabella.
Mettere i campi in un ordine particolare.
Compiere alcune operazioni sui dati (ad esempio sommare tutti i numeri su una colonna,
oppure contare il numero di record che una tabella contiene).
Si possono creare delle query clickando sul bottone "Query" a destra della finestra che contiene il
database:
23
Clickando su questo bottone, viene visualizzata un'interfaccia che ci domanda se vogliamo creare
una query "in visualizzazione Struttura" o "mediante una creazione guidata". In un primo tempo,
creeremo una query mediante una creazione guidata. Quindi, si faccia doppio click sul testo "Crea
una query mediante una creazione guidata". In questo modo, viene visualizzata la seguente
interfaccia:
24
Questa interfaccia è composta dai seguenti elementi fondamentali:
•
•
•
La lista "Tabelle/Query", ovvero una lista delle tabelle presenti nel database, oppure delle
query che sono già state create
La lista "Campi disponibili" contenente i campi che possono essere restituiti come output
della query.
La lista "Campi selezionati" contenente i campi che devono essere restituiti come output
della query.
Selezionare "Tabella: Customer" nella lista "Tabelle/Query" (si noti che i campi della lista "Campi
disponibili" cambia automaticamente quando si cambia tabella).
Adesso, dalla lista "Campi disponibili", si spostino nella lista "Campi selezionati" i campi "Name",
"Address", "City" e "State" della tabella "Customer". Per fare questo, basta clickare su un campo, in
modo da evidenziarlo e clickare sulla freccia che punta da destra a sinistra al centro dell'interfaccia
e ripetere la stessa operazione per tutti i campi desiderati. Una volta fatta questa operazione,
l'interfaccia dovrebbe avere il seguente aspetto:
Clickare su "Avanti" per andare al passo finale nella creazione di questa prima semplice query.
In questo ultimo passo, occorre dare un nome alla query. Nell'interfaccia relativa, si dia il nome
"Customer Address" a questa query.
A questo punto, si può scegliere se visualizzare le informazioni della query e chiudere la query,
oppure modificarne la struttura.
In questo esempio, selezionare l'opzione "Aprire la query per visualizzare le informazioni" e
clickare su "Fine".
25
In conseguenza di queste azioni, viene visualizzata la seguente interfaccia, contenente l'output della
query, ovvero i campi richiesti dei vari record della tabella "Customer":
Per chiudere questa finestra, clickare sulla croce con sfondo rosso in alto a destra.
Si noti che adesso esiste un'icona sulla finesta "banca" per la query "Customer Address" che
abbiamo appena creato:
26
Adesso, supponiamo di voler modificare la query "Customer Address" in modo da visualizzare i
dati relativi all'indirizzo solo per quei clienti che vivono nello stato della Georgia.
Per questo, utilizzeremo la modalità di creazione/modifica delle query "in visualizzazione
Struttura".
Per fare ciò, occorre clickare sulla query "Customer Address", in modo da evidenziarla, e poi
clickare su "Struttura" in alto nell'interfaccia "banca". Appare la seguente finestra:
27
Questa finestra è divisa in due parti fondamentali: quella superiore, in cui vengono visualizzate le
tabelle utilizzate per questa query, con tutti i loro campi disponibili, e quella inferiore, in cui
vengono visualizzati solo i campi che sono stati selezionati e usati nella query.
Ognuno di questi campi ha diverse opzioni associate:
•
•
•
•
•
•
Campo
Tabella
Ordinamento
Mostra
Criteri
Oppure:
In questo esempio, vogliamo visualizzare le informazioni relative a quei clienti che vivono nello
stato della Georgia e vogliamo anche ordinare queste informazioni in base alla città, per ordine
alfabetico.
Per ordinare alfabeticamente i record in base alla città, basta clickare nell'area "Ordinamento" sotto"
il nome "City" e scegliere, ad esempio, "Crescente" nel menu che viene visualizzato, come mostra
la seguente figura:
28
Per filtrare l'output della query in modo che vengano visualizzati solo i clienti che vivono nello
stato della Georgia, clickare nell'area "Criteri" sotto il nome "State" e scrivere in quest'area il
seguente comando:
= 'GA'
come mostra la figura seguente:
29
A questo punto, per eseguire la query, si clicki sul menu "Query" e si selezioni il comando
"Esegui". Il risultato che verrà visualizzato è:
30
Infine, si chiuda e si salvi questa nuova query, ritornando all'interfaccia principale di MS-Access.
5.6.2. Query su Tabelle Multiple
Supponiamo, ad esempio, di voler visualizzare una lista di tutti i clienti e del tipo di conto corrente
che ognuno di essi possiede. E' chiaro che una query come questa richiede l'uso di entrambe le
tabelle. Per poterla eseguire, MS-Access si baserà sulle relazioni tra tabelle che abbiamo precedente
definito.
Si comincia creando una nuova query esattamente come visto nella sezione 5.6.1.
Quindi, si clicki due volte su "Crea una query mediante una creazione guidata", quindi si scelgano i
campi "CustomerID" e "Name" dalla tabella "Customer"; successivamente, si passi alla tabella
"Accounts" e da essa si scelgano i campi "CustomerID", "AccountType" e "Balance".
Il risultato di queste operazioni viene visualizzato come nella seguente figura:
Clickando su "Avanti", MS-Access ci domanderà a che livello di dettaglio vogliamo visualizzare
l'informazione. In questo esempio, selezioniamo "Dettaglio (mostra tutti i campi di tutti i record)" e
si clicki di nuovo sul bottone "Avanti". Si scelga il nome "Customer Accounts Query" per questa
query, si selezioni l'opzione "Aprire la query per visualizzare le informazioni" e si clicki su "Fine".
L'output di questa query viene visualizzato nel seguente modo:
31
A questo punto, come mostrato nella sezione 5.6.1., la query potrebbe essere modificata, ad
esempio aggiungendo dei filtri (per esempio, potremmo voler visualizzare i dettagli dei conti
corrente dei soli clienti che vivono nello stato della Georgia).
5.3. Una Query un po' più complicata
Si supponga, adesso, per ogni cliente, di voler vedere la somma del denaro disponibile su tutti i
conti correnti in suo possesso, la media del denaro depositato su ognuno dei conti correnti e il
massimo e il minimo delle somme depositate su uno dei conti correnti.
Per fare questo, si inizia creando la query clickando due volte su "Crea una query mediante una
creazione guidata". Successivamente, si selezionano i campi "CustomerID" e "Name" dalla tabella
"Customer" e il campo "Balance" dalla tabella "Accounts". Poi si clicka su "Avanti".
A questo punto, contrariamente a quanto fatto negli esempi precedenti, si selezioni l'opzione
"Riepilogo" e, prima di clickare sul bottone "Fine", si clicki sul bottone "Opzioni di riepilogo".
Viene visualizzata l'interfaccia seguente, dove occorre selezionare le opzioni: "Somma", "Media",
"Min", "Max" e l'opzione "Conta record in accounts":
32
A questo punto, basta clickare su "OK" e la finestra "Opzioni di riepilogo" sparisce.
Clickando su "Fine" nella finestra "Creazione guidata query semplice", viene visualizzato il
seguente risultato, che contiene tutte le informazioni che stavamo cercando:
33