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