Autore: Andrea P.
Per recuperare dati da un database è possibile usare il linguaggio di programmazione SQL (Structured Query Language – pronuncia: “esse-qu-elle”, “es-que-el”, “sequel”). Con esso si possono creare query più efficaci e correggere in modo più facile eventuali query che non restituiscono i risultati voluti.
Per ogni query eseguita dai programmi di database relazionale come Microsoft Access (che per costruire le interrogazioni utilizza una comoda interfaccia QBE – Query by example), viene usato un sistema interno per la traduzione automatica in SQL.
SQL può essere usato anche per creare e modificare la struttura degli oggetti di database, come per esempio le tabelle.
Per usare direttamene il linguaggio SQL nelle query di Access, è necessario creare un database e selezionare l’icona che permette di creare una query in visualizzazione struttura, chiudere la finestra di selezione delle tabelle o delle query che si aprirà e, dalla barra multifunzione, cliccare l’icona Visualizzazione SQL.
Ovviamente se precedentemente è stata già fatta una query, se ne può vedere il codice SQL aprendola e scegliendo dalla barra multifunzione la scheda Home e dal gruppo Visualizzazioni, l’icona Visualizzazione SQL.
Clausole SQL
Un’istruzione SQL è composta da clausole, ognuna delle quali esegue una funzione dell’istruzione SQL stessa.
Clausole SQL principali: SELECT, FROM e WHERE
In generale, un’istruzione SQL si presenta nella forma seguente:
SELECT Campo1 FROM Tabella1 WHERE Criterio1;
SELECT e FROM sono obbligatorie, mentre WHERE è facoltativa
Ad esempio SELECT Email FROM Contatti WHERE Città=”Roma”;
seleziona i dati del campo Email della tabella Contatti, i cui record del campo Città sono denominati Roma.
Clausola SELECT
SELECT Email
È costituita dall’operatore SELECT seguito dall’identificatore Email.
Se un identificatore contiene spazi (come Indirizzo E-mail) o caratteri speciali (come segni di punteggiatura), va tra parentesi quadre, altrimenti queste ultime sono facoltative.
Selezionare campi – per conoscere i numeri di telefono dei clienti memorizzati nel campo Telefono Clienti, la clausola SELECT sarà:
SELECT [Telefono Clienti]
Se nell’istruzione SQL sono presenti due o più campi con lo stesso nome, nella clausola SELECT bisogna aggiungere al nome di ognuno, il nome dell’origine dati corrispondente. Il nome dell’origine dati deve essere lo stesso usato nella clausola FROM.
Selezionare tutti i campi – per includere tutti i campi di un’origine dati, è possibile elencarli uno ad uno nella clausola SELECT o usare la wildcard *.
Se si usa l’asterisco e sono presenti più origini dati, bisogna indicare il nome dell’origine dati con l’asterisco. Ad esempio per selezionare tutti i campi della tabella Ordini ma solo il campo Email della tabella Contatti. La clausola SELECT sarà:
SELECT Ordini.*, Contatti.[Email]
Selezionare valori distinti – per visualizzare solo dati distinti e non i ridondanti, bisogna usare la parola chiave DISTINCT nella clausola SELECT. Ad esempio se per qualche motivo per alcuni clienti è usato lo stesso numero di telefono e si vuole che tale numero sia restituito una sola volta, la clausola SELECT sarà:
SELECT DISTINCT [Telefono Clienti]
Usare nomi sostitutivi per campi o espressioni con la parola chiave AS – per i campi presenti in visualizzazione Foglio dati è possibile modificare l’etichetta visualizzata usando la parola chiave AS e un alias di campo (cioè un nome) nella clausola SELECT. Ad esempio per selezionare i dati del campo Telefono Clienti, la clausola SELECT sarà:
SELECT [Telefono Clienti] AS [Tel]
Selezionare tramite un’espressione – ad esempio per ottenere l’Anno di nascita dei clienti in base ai dati presenti nel campo Nato il, la clausola SELECT sarà:
SELECT DatePart(“yyyy”,[Nato il]) AS [Anno di nascita]
L’espressione è composta dalla funzione DatePart e da due argomenti, la costante “yyyy” e l’identificatore Anno di nascita.
Clausola FROM
FROM Contatti
È costituita dall’operatore FROM seguito dall’identificatore Contatti.
Clausola WHERE
WHERE Città=”Roma”
È costituita dall’operatore WHERE seguito dall’espressione Città=”Roma”.
Clausola ORDER BY per ordinare i risultati
Usando una clausola ORDER BY si può specificare come ordinare i risultati quando viene eseguita una query.
Se si usa tale clausola, questa deve essere l’ultima dell’istruzione SQL.
Ad esempio per ordinare i risultati in base al valore del campo Email in ordine decrescente, la clausola ORDER BY sarà:
ORDER BY Email DESC
Si usa la parola chiave DESC perché per default Access ordina i valori in ordine crescente.
Clausole GROUP BY e HAVING per usare dati riepilogati
Supponendo che l’esempio precedente sia leggermente più complesso tipo:
SELECT Email,[Gruppo societario] FROM Contatti WHERE Città=”Roma”;
e si desidera che la query mostri il totale delle Email elencate per ogni gruppo societario, la clausola SELECT sarà:
SELECT COUNT(Email), [Gruppo societario]
Le funzioni di aggregazione che è possibile usare dipendono dal tipo di dati presente nel campo o nell’espressione che si intende utilizzare.
Con le funzioni di aggregazione, in genere è necessario usare anche una clausola GROUP BY. Quest’ultima elenca tutti i campi a cui una funzione di aggregazione non viene applicata, ma se si applicano funzioni di aggregazione a tutti i campi di una query, non è necessario crearla.
La clausola GROUP BY segue immediatamente la clausola WHERE o la clausola FROM, se la clausola WHERE non è presente.
Se, riprendendo l’esempio precedente, nella clausola SELECT viene applicata una funzione di aggregazione al campo Email ma non al campo [Gruppo societario], la clausola GROUP BY sarà:
GROUP BY [Gruppo societario]
Se si desidera usare criteri per limitare i risultati ma il campo a cui si vogliono applicare i criteri è usato in una funzione di aggregazione, non è possibile usare una clausola WHERE, ma va usata una clausola HAVING, che funziona in modo analogo alla clausola WHERE.
Si supponga ad esempio di usare la funzione COUNT, che calcola un valore medio, con il primo campo della clausola SELECT:
SELECT COUNT(Email),[Gruppo societario]
Per far sì che la query restituisca righe solo se al Gruppo societario sono associati più Email, la clausola HAVING sarà:
HAVING COUNT(Email)>1
Operatore UNION per combinare i risultati di una query
Per rivedere contemporaneamente tutti i dati restituiti da più query di selezione analoghe, si usa l’operatore UNION che permette di combinare due istruzioni SELECT in una sola. Le istruzioni SELECT combinate devono avere lo stesso numero di campi di output, nello stesso ordine e con tipi di dati uguali o compatibili.
Quando si usa l’operatore UNION è possibile, attraverso la parola chiave ALL, specificare se i risultati della query devono includere eventuali righe duplicate.
Ecco la sintassi per una query di unione che combina due istruzioni SELECT:
SELECT Campo1 FROM Tabella1 UNION [ALL] SELECT Campoa FROM Tabellaa;
Si supponga di avere una tabella Prodotti e un’altra Servizi contenenti entrambe: nome del prodotto o del servizio; prezzo; disponibilità di una garanzia o un’assicurazione; eventuale offerta del prodotto o del servizio. Anche se la tabella Prodotti ha record relativi a una garanzia, mentre Servizi relativi a un’assicurazione, entrambi i dati specificano se un particolare prodotto o servizio viene fornito con un plus.
La seguente query di unione combina i quattro campi delle due tabelle:
SELECT nome, prezzo, garanzia, offerta FROM Prodotti
UNION ALL
SELECT nome, prezzo, assicurazione, offerta FROM Servizi;