giovedì 27 novembre 2008

Esercitazioni con SQL: query semplici e join in Access

Riprendendo una definizione data in post precedenti, possiamo definire Access un'applicazione per la gestione di basi di dati (DB) relazionali (per questo classificabile con la sigla RDBMS). In Access le informazioni sono contenute in oggetti che si chiamano tabelle ed è possibile interrogare queste tabelle estraendo solo le informazioni necessarie o creando delle relazioni fra di esse.


1. Introduzione alle Query in Access
Le Query sono lo strumento che permette di estrerre le informazioni di una base di dati. I tipi di Query che è possibile creare in Access sono:

Selezione
Cancellazione
Modifica(aggiornamento)
Accodamento
Creazione tabella
Campi incrociati
Query speciali

Le Query in Access possono essere espresse sia graficamente, utilizzando il linguaggio QBE (query by example) sia utilizzando il linguaggio SQL. Queste vengono create in un'apposita pagina di creazione query e le risposte vengono visualizzate direttamente sotto forma di tabelle.
Con il pulsante in alto a destra si possono alternare 3 visualizzazioni diverse:
  1. Struttura: per creare la query graficamente;
  2. SQL: per creare la query utilizzando il linguaggio SQL;
  3. Foglio dati per visualizzare i risultati della query.
Access trasforma automaticamente le query grafiche in SQL e viceversa quando si alternano le due modalità di visualizzazione.


2. Le Query di Selezione
Questo tipo di query permette di filtrare una o più tabelle, essendo capace di isolare solamente qualche riga o colonna di una tabella o qualche combinazione di colonne fra tabelle.
L'operazione più semplice che si può fare con le query di selezione è quella di selezionare solamente alcune colonne di una stessa tabella. Chiameremo a tal proposito questo tipo di query "Query Semplice".


2.1. Come realizzare una Query Semplice
Dopo aver aperto il DB di nostro interesse, scegliamo, nella colonna di sinistra contenente gli oggetti, l'ogetto "Query" e selezioniamo l'opzione "Crea una query in visualizzazione Struttura". Normalmente la query non visualizza alcun campo, occorrerà pertanto scegliere manualmente quale campo visualizzare, trascinandolo nello spazio sottostante. Per cui, dopo aver aggiunto attraverso la finestra "mostra tabella" la tabella di nostro interesse nella finestra "Query di selezione", trasciniamo manualmente i campi desiderati nell'area sottostante di questa finestra. Teniamo presente che il simbolo "*" indica tutti i campi di una tabella ed equivarrà a portare manualmente nella query tutti questi.
Ogni campo nella tabella di risposta mantiene il nome che aveva nella tabella originale, è però possibile cambiare il nome del campo nella tabella risposta scrivendo Nuovonome:nome_campo o anche attraverso il linguaggio SQL specificando un alias (ad esempio data_nascita "AS" data di nascita). Inoltre, alcuni campi possono essere calcolati a partire dal valore dei record dei campi considerati. In questo caso è sufficiente inserire nella riga "Campo" la formula capace di calcolare il nuovo valore. In questo caso sarà ovviamente necessario o almeno consigliabile cambiare il nome del campo.
I campi del record di partenza utilizzati nella formula devono, inoltre, essere scritti tra parentesi quadre (comunque qualora le dimenticassimo Access ci viene in aiuto facendolo per noi). Ad esempio: [anno_immatricolazione] - [anno_nascita] restituirà un nuovo campo che potrebbe chiamarsi Età immatricolazione.




2.2 Degli esempi concreti


ESEMPIO 1. Dal nostro DB Northwind creiamo una query in visualizzazione struttura. Supponiamo di essere interessati ad isolare dalla tabella clienti solamente alcune informazioni, per esempio: il codice ID del cliente, il suo nome e la sua nazione.

- In visualizzazione struttura non dovremo far altro che aggiungere la tabella di nostro interesse ("Customers"), trascinare manualmente i campi (CustomerID, ContactName e Country) e cliccare "!" per visualizzare la tabella risultato. Andando su visualizza "linguaggio SQL" potremo anche vedere la sintassi della nostra query.

- Utilizzando il linguaggio SQL non dovremo far altro che usare una sintassi molto semplice:


SELECT Nome_campo

FROM Nome_tabella


Ovvero


SELECT Customers.CustomerID, Customers.ContactName, Customers.Country

FROM Customers;



ESEMPIO 2. Se volessimo affinare la nostra ricerca basterebbe aggiungere ulteriori criteri di estrazione dati. Per esempio potremmo voler ottenere solamente il nome dei clienti francesi e il loro indirizzo.

- In visualizzazione struttura basterà agginugere tra i "criteri" del campo Country "France", aggiungere un ulteriore campo "Address" e cliccare ovviamente "!".

- Utilizzando il linguaggio SQL basterà aggiungere alla sintassi di sopra la clausola WHERE.


SELECT Customers.CustomerID, Customers.ContactName, Customers.Country, Customers.Address
FROM Customers
WHERE (Customers.Country)="France";


ESEMPIO 3. Se, invece, volessimo raggruppare i clienti per regione e sapere quanti ne abbiamo in ogni regione basterebbe:
- In visualizzazione struttura selezionare la tabella Customers e i campi ContactName e Country, col tasto destro sulla colonna ContactName selezionare "Totali" e la formula "Conteggio" specificando magari l'Ordinamento "Crescente" ed infine specificare la formula "Raggruppamento" per la colonna Country.
- Utilizzando il linguaggio SQL la sintassi sarebbe invece:

SELECT Count(Customers.ContactName) AS ConteggioDiContactName, Customers.Country
FROM Customers
GROUP BY Customers.Country
ORDER BY Count(Customers.ContactName);


3. JOIN in Access: le relazioni fra tabelle
Access, essendo un database relazionale, si caratterizza proprio per il fatto di essere composto da tabelle collegate tra loro tramite relazioni logiche. Tali relazioni consentono di collegare le tabelle in base ai campi comuni. In una query la relazione che può venirsi a instaurare tra due tabelle è legata al concetto di Join e di Integrità referenziale tra le tabelle.
La relazione, nello specifico, è un legame che si viene a creare tra i campi comuni delle tabelle. Un campo comune è un campo presente in due o più tabelle che consente di unire le informazioni dei record di una tabella con quelle contenute nei record di un'altra. Tale campo è la chiave primaria in una tabella e la chiave esterna (campo con vincolo di integrità) nell'altra. Il tipo di campo è importante dal momento che i campi da collegare devono avere lo stesso tipo di dati.

I tipi di relazioni che possono venirsi a creare possono essere del tipo:
-UNO a UNO: quando a un record della tabella principale corrisponde un solo record della tabella correlata e viceversa;
-UNO a MOLTI: quando ad ogni record della tabella principale corrispondono più record della tabella correlata (ma non viceversa);
-MOLTI a MOLTI: quando ogni record della tabella principale corrisponde a più record della tabella correlata e viceversa. Qusto tipo di relazione non può essere rappresentato direttamente ma occorrerà creare una tabella di congiunzione.

A seconda del modo in cui le tabelle vengono unite, è possibile creare principalmente 3 tipi di Join di base, ovvero inner join, outer join di tipo left e outer join di tipo right.


3.1 L'INNER JOIN (Join interno)
Questo tipo do join consente la selezione di un record, per essere incluso in una Query di selezione, soltanto quando nelle 2 tabelle esiste l'esatta corrispondenza tra i campi posti in relazione. Per realizzare un INNER JOIN, se in precedenza sono state create le relazioni fra tabelle, non è necessario eseguire alcuna operazione specifica. Esso verrà creato automaticamente quando verranno aggiunte le tabelle correlate in visualizzazione struttura della query. Inoltre, se viene applicata l'integrità referenziale, visualizzaremo "1" sulla linea di join per indicare la tabella che si trova sul lato "uno" di una relazione "UNO a MOLTI" e il simbolo di infinito "
∞" per indicare la tabella che si trova sul lato "molti".
La sintassi SQL è molto semplice:


SELECT nome_campo
FROM nome_tabella1 INNER JOIN nome_tabella2 ON nome_tabella1.nome_campo1 operatorediconfronto nome_tabella2.nome_campo2

ESEMPIO:
Prendendo sempre in considerazione il nostro DB Northwind, potremmo voler sapere il nome dei prodotti forniti da ciascun fornitore.
- In visualizzazione struttura basterà aggiungere le due tabelle di nostro interesse, ovvero Supplier e Products, e aggiungere alla query i campi SupplierID o CompanyName dalla prima tabella e ProductName dalla seconda.
- Utilizzando il linguaggio SQL la sintassi sarebbe invece:

SELECT Suppliers.SupplierID, Products.ProductName
FROM Suppliers INNER JOIN Products ON Suppliers.SupplierID = Products.SupplierID;


3.2 Gli OUTER JOIN
Gli altri due tipi di join appartengono alla categoria OUTER JOIN. Questo tipo di join, al pari del primo, viene effettuato sulla base di una corrispondenza di alcuni valori sulle tabelle. La differenza sta però nel fatto che in questo caso è possibile anche estrarre le righe di una tabella che non hanno corrispondenti nell'altra. Le outer join si distinguono in left outer join e right outer join. Più nello specifico:

- LEFT OUTER JOIN (join a sinistra). Se da un DB chiamato, per esempio, Olimpiadi volessimo ottenere un prospetto contenente tutte le Nazioni del mondo e a fianco di ciascuna di esse l'indicazione del numero di medaglie vinte nel corso di tutte le edizioni faremmo un'operazione di JOIN tra la tabella Nazioni e la tabella Risultati. In questo caso il campo che le lega sarebbe il campo IdNazione. Se eseguissimo una INNER JOIN otterremmo un elenco che escluderebbe tutte le Nazioni che non hanno mai vinto una medaglia d'oro, perchè la INNER JOIN prevede la presenza del valore del campo relazionato in entrembe le tabelle; eseguendo una OUTER JOIN di tipo LEFT, ponendo "sulla sinistra" la tabella delle Nazioni, otterremo invece l'elenco completo delle Nazioni. Naturalmente otteremo molti valori uguali a zero.
In modalità visualizzazione struttura selezioniamo "Totali" quindi la Formula "Raggruppamento" per il campo Nazione e la Formula "Conteggio" per il campo Vincitore. Facciamo doppio click sulla linea che congiunge le 2 tabelle, nella parte alta della finestra facendo apparire la finestra di dialogo "Proprietà join". Noteremo che la tabella di sinistra è Nazioni, mentre quella di destra è "Risultati". Definire una JOIN di tipo LEFT OUTER JOIN equivale a selezionare l'opzione 2 e cioè includi tutti i record di "Nazioni" e solo i record di "Risultati" in cui i campi collegati sono uguali. Facciamo click su "OK" e notiamo ancora che la linea che collega le 2 tabelle presenta una freccia rivolta verso destra: questo sta ad indicare è stato impostato un LEFT JOIN (la regola è inversa).


Se avessimo impostato '3' la freccia sarebbe rivolta verso sinistra ma in quel caso si tratterebbe di RIGTH JOIN.

- RIGHT OUTER JOIN (join a destra), una SELECT che include tutti i record della seconda tabella (quella di destra) di due tabelle, anche se non vi sono valori corrispondenti ai record della prima tabella (quella di sinistra).

Nessun commento: