#Access: come creare query

Creare query QBE e SQL

Autore: Andrea Pacchiarotti
Ultimo aggiornamento: 12 Aprile 2021
Categoria: Microsoft Office Access Come creare query

Access Come creare query
#Access: come creare query

L’oggetto query serve per interrogare il database, il termine deriva infatti dall’inglese to query che significa interrogare.
Si può costruire tramite un’interfaccia grafica (detta Query By Example o QBE) che ne consente l’uso anche ai principianti oppure utilizzare il linguaggio SQL (Structured Query Language) per ottenere query creabili sia con QBE che senza.
I risultati di una query si chiamano recordset.

Sommario #Access: come creare query

Tipi di query Access

È possibile creare query in molti modi diversi.
Cliccando la scheda Crea e poi l’icona Creazione guidata Query si hanno quattro tipi di creazione:

Cliccando invece Struttura query si hanno otto tipi di creazione:

Dalla Struttura della Query (prima icona a sinistra) è possibile  vedere l’SQL.

Esistono anche:

Operatori per query Access

Operatori di confronto

Operatori logici

Operatori universali

Operatori matematici e di stringa

Operatori con Date()

SQL

Per recuperare dati da Access, ma anche da altri database, è possibile usare un linguaggio di programmazione relativamente semplice chiamato SQL (Structured Query Language), letto siquel. In realtà, anche se non ce ne accorgiamo, per ogni query è tale linguaggio che viene eseguito in background.
Un po’ come quando si decide di registrare una macro Excel e l’applicativo scrive per noi il codice VBA.
Con l’SQL è possibile creare query più efficaci e modificare in maniera più facile query che non restituiscono i risultati desiderati.
Dove si scrive il codice SQL? Creando una Query in Visualizzazione struttura, andando su Progettazione e poi su Definizione dati.
Per vedere SQL di una Query si va su Home, Visualizza, Visualizzazione SQL.

Operatori SQL più comuni

Clausole SQL più comuni

In generale, un'istruzione SQL si presenta così:
SELECT Campo1
FROM Tabella1
WHERE Criterio1;

Ogni istruzione SELECT termina con un punto e virgola che può trovarsi alla fine dell'ultima clausola o da sola al termine dell'istruzione SQL stessa.
Ad esempio per ottenere tutti i Cognomi delle persone che si chiamano Sara si può scrivere un codice del genere:
SELECT Cognome
FROM Contatti
WHERE Nome = 'Sara';

Clausola SELECT

Una clausola SELECT permette di selezionare i campi specificandone i nomi (ma anche espressioni o un’altra istruzione SELECT) per usarne i dati in una query.
Ad esempio per sapere i numeri di telefono dei clienti contenuti in un campo denominato TelefonoClienti, la clausola SELECT sarà:
SELECT [TelefonoClienti]
L'uso delle parentesi quadre è obbligatorio solo se il nome contiene spazi o caratteri speciali.

Selezionare tutti i campi
Per includere tutti i campi di un'origine dati, è possibile elencarli nella clausola SELECT o usare il carattere jolly *. Ciò garantisce che la query sia aggiornata se vengono aggiunti nuovi campi all'origine dati.
Ad esempio per selezionare tutti i campi della tabella Ordini ma solo il campo E-mail della tabella Contatti, si avrà:
SELECT Ordini.*, Contatti.[E-mail]

Selezionare valori distinti
Per visualizzare solo dati univoci, usare la parola chiave DISTINCT all'interno di SELECT.
Ad esempio se per alcuni clienti è usato lo stesso numero di telefono, ma si vuole che ogni numero di telefono venga visualizzato una sola volta, si avrà:
SELECT DISTINCT [TelefonoClienti]

Usare nomi sostitutivi per campi o espressioni tramite la parola chiave AS
Per qualsiasi campo in visualizzazione Foglio dati è possibile modificare l'etichetta mostrata tramite la parola chiave AS e un alias di campo (nome assegnato a un campo in una query per rendere più leggibili i risultati) nella SELECT.
Ad esempio per selezionare i dati del campo TestoClntTel è possibile migliorare la leggibilità dei risultati usando l’alias Telefono Clienti come segue:
SELECT [TestoClntTel] AS [Telefono Clienti]

Selezionare usando un'espressione
Ad esempio per ottenere l'anno di nascita dei clienti dal campo DataNascita si userà qualcosa di simile a:
SELECT DatePart("yyyy",[DataNascita]) AS [Anno di nascita] dove DatePart è una funzione

Clausola FROM

La clausola FROM specifica le tabelle o le query contenenti i dati usati da SELECT.
Ad esempio per conoscere il numero di telefono di un cliente specifico presente nella tabella TClienti, la clausola FROM sarà:
FROM TClienti
L'uso delle parentesi quadre è obbligatorio solo se il nome contiene spazi o caratteri speciali.

Usare nomi sostitutivi per le origini dati
È anche possibile usare un alias di tabella nella clausola FROM. Ad esempio per selezionare i dati di due campi, entrambi denominati ID, uno dei quali appartiene alla tabella TClienti e l'altro alla tabella TOrdini, si userà:
SELECT [TClienti].[ID], [TOrdini].[ID]
Con gli alias si avrà:
FROM [TClienti] AS [C], [TOrdini] AS [O]
Gli alias di tabella possono essere poi usati nella SELECT:
SELECT [C].[ID], [O].[ID]

Clausola WHERE

Sintassi: WHERE Campo = Criterio
Ad esempio per sapere il numero di telefono di un cliente di cui si conosce il Cognome, Rossi:
WHERE [Cognome]='Rossi'
Vediamo altri esempi per limitare i risultati con i criteri:
>20 AND <30 applicabile a qualsiasi campo di tipo numerico (include solo i record il cui campo contiene un valore maggiore di 20 e minore di 30)
DateDiff ("aaaa", [DataNascita], Date()) > 10 applicabile a un campo Data/Ora. Include solo i record in cui il numero di anni tra la data di nascita e la data corrente è maggiore di 10
Is Null applicabile a qualsiasi tipo di campo per visualizzare i record in cui il valore del campo è Null

Clausola ORDER BY

Per ordinare i risultati prima in base al valore del campo Società in ordine decrescente e, se per alcuni record (ad esempio le E-mail) il valore di Società è lo stesso, ordinare l’indirizzo di posta elettronica in ordine crescente, si avrà:
ORDER BY Società DESC, [E-mail]
Access ordina i valori in ordine crescente (A-Z, dal più piccolo al più grande), per l’ordinamento decrescente si usa DESC.
Altri esempi:
SELECT Cognome, Nome
FROM Impiegati
ORDER BY Cognome;

SELECT Cognome, Nome
FROM Impiegati
ORDER BY Cognome ASC;

Funzioni di aggregazione SQL

Per riepilogare i dati si usano le funzioni di aggregazione:

Ad esempio per contare gli indirizzi di posta elettronica si usa:
SELECT COUNT([E-mail]), Società
Le funzioni di aggregazione utilizzabili dipendono dal tipo di dati a disposizione.

Clausola GROUP BY

Quando si usano funzioni di aggregazione, a volte bisogna creare un elenco di tutti i campi a cui una funzione di aggregazione non viene applicata.
La clausola GROUP BY segue immediatamente WHERE o FROM, se WHERE non è presente.
SELECT ElencoCampi
FROM tabella
WHERE criteri
[GROUP BY ElencoCampiGruppo]
Ad esempio:
GROUP BY Società

Clausola HAVING

La clausola HAVING funziona in modo analogo a WHERE ma viene usata per dati di aggregazione.
SELECT ElencoCampi
FROM Tabella
WHERE CriteriSelezione
GROUP BY ElencoCampiGruppo
[HAVING CriteriGruppo]
Se ad esempio si vuole che la query restituisca righe solo se alla Società sono associati più indirizzi E-mail, si avrà:
HAVING COUNT([E-mail])>1
Oppure
SELECT CategoriaID,
Sum(ProdottiInStock)
FROM Prodotti
GROUP BY CategoriaID
HAVING Sum(ProdottiInStock) > 100 And Like "C*";

Operatore UNION

Consente di combinare due istruzioni SELECT in una sola se vengono rispettati dei vincoli, le SELECT combinate devono infatti avere lo stesso numero di campi di output, nello stesso ordine e con tipi di dati uguali o compatibili. Quando la query viene eseguita, i dati di ogni set di campi corrispondenti vengono combinati in un unico campo di output. Il risultato della query avrà quindi lo stesso numero di campi di ognuna delle istruzioni SELECT.
Quando si usa l'operatore UNION, è possibile, attraverso la parola chiave ALL, anche specificare se i risultati della query devono includere righe duplicate.
Ecco un esempio:
SELECT Campo1
FROM Tabella1
UNION [ALL]
SELECT CampoA
FROM TabellaA;

Si supponga di avere due tabelle: TProdotti e TServizi. In entrambe sono presenti i campi Nome, Prezzo, Garanzia. Anche se TProdotti contiene informazioni sul prezzo e TServizi sulla garanzia, le informazioni sono essenzialmente le stesse, ovvero specificano se un prodotto viene fornito con una promessa di qualità. Con la seguente query di unione è possibile combinare i tre campi delle due tabelle:
SELECT Nome, Prezzo, Garanzia
FROM TProdotti
UNION ALL
SELECT Nome, Prezzo, Garanzia
FROM TServizi;
Oppure
SELECT [Prodotti ID], [Data Ordine], [Nome Compagnia], [Transazione], [Quantita]
FROM [Ordini]
UNION
SELECT [Prodotti ID], [Data Creazione], [Nome Compagnia], [Transazione], [Quantita]
FROM [Acquisti]
ORDER BY [Data Ordine] DESC;

Query pass-throught e query di definizione dati

Entrambe queste tipo di query vengono fatte in SQL.
Le query pass-throught servono per lavorare con le tabelle dei server, mentre  le query di definizione dati non recuperano dati, ma creano, modificano, eliminano oggetti di database; possono essere rischiose poiché le azioni non sono accompagnate da finestre di dialogo di conferma.
Facciamo un esempio.

(
CONTATORE AutoIncrement,
NOME Text (15) NOT NULL,
COGNOME Text,
ETÀ Integer,
STIPENDIO Currency,
DIPLOMATO Bit
)

Seconda query
INSERT INTO Anagrafica
VALUES (1,"Sara", "Moretti", 40, 1000, 0);

Veloce promemoria query SQL

CREATE – Creazione tabella
CREATE TABLE NomeTabella (NomeCampo1 TipoCampo1 [NOT] NULL, …)
CREATE TABLE Docenti (ID AutoIncrement, Nome Text (255), Cognome Text (255), LuogoNascita Text (255)
Oppure (notare il campo Luogo Nascita messo tra parentesi quadre)
CREATE TABLE [Docenti] ([ID] AutoIncrement, [Nome] Text (255), [Cognome] Text (255), [Luogo Nascita] Text (255)

ALTER – Modifica tabella
ALTER TABLE NomeTabella ADD/MODIFY/DROP COLUMN NomeCampo1 TipoCampo1, …
- ADD COLUMN aggiunge un campo
- MODIFY COLUMN modifica un campo con un diverso tipo
- DROP COLUMN elimina un campo (quest’ultimo non necessita del parametro tipo_campo).

DROP – Cancellazione tabella
DROP TABLE NomeTabella

INSERT – Inserimento dati in tabella
INSERT INTO NomeTabella (NomeCampo1, …) VALUES (ValoreCampo1, …)
INSERT INTO Docenti (Nome, Cognome, LuogoNascita) VALUES (‘Mario’, ‘Rossi’, ‘Roma’)
Se sono di tipo testo o memo i valori vanno tra gli apici

SELECT – Interrogazione tabella
SELECT NomeCampo1 …/* FROM NomeTabella
L’asterisco sta per tutti i campi.
SELECT * FROM Docenti
Questa query estrae tutti i campi della tabella docenti

SELECT Nome, Cognome FROM Docenti
Questa query estrae i campi Nome e Cognome della tabella docenti

SELECT Nome, Cognome FROM Docenti WHERE ID = 1
Questa query filtra i dati restituendo nome e cognome dal record della tabella Docenti con ID = 1

SELECT Nome FROM Docenti WHERE ID = 1 AND Cognome LIKE ‘R*’
Questa query filtra i dati restituendo il nome della tabella Docenti con ID = 1 e Cognome che inizia con R.

SELECT * FROM Docenti WHERE ID BETWEEN 20 AND 40
Questa query filtra i dati restituendo tutti i dati della tabella Docenti con ID tra 20 e 40

UNION unisce i risultati di due tabelle in un unico risultato
SELECT * FROM Docenti UNION SELECT * FROM Città
DISTINCT permette di estrarre solo una volta il dato che può comparire più volte uguale
SELECT DISTINCT Nome FROM Docenti WHERE Nome = ‘Mario’

UPDATE – Aggiornamento tabella
UPDATE NomeTabella SET NomeCampo = ‘valore’ WHERE CampoCondizione = ‘ValoreCondizione

DELETE – Cancellazione dati da tabella
DELETE * FROM NomeTabella WHERE CampoCondizione = ValoreCondizione

JOIN – Relazioni tra più tabelle
JOIN permette di creare relazioni tra tabelle, ma è possibile farlo anche con SELECT…FROM…WHERE.
Segnalando che per indicare un campo contenuto in una tabella si usa NomeTabella.NomeCampo, ecco i due casi:

SELECT Docenti.Nome, Docenti.Cognome, Docenti.LuogoNascita, Città.Regione, Città.CodicePostale FROM Docenti, Città WHERE Docenti.LuogoNascita = Città.Città

Quanto sopra SELEZIONA il campo Nome e il campo Cognome dalla tabella Docenti, il campo LuogoNascita dalla tabella Docenti, il campo Regione dalla tabella Città, il campo CodicePostale dalla tabella Città DALLE tabelle Docenti e Città DOVE il campo LuogoNascita della tabella Docenti è uguale al campo Città della tabella Città.

La stessa procedura con JOIN:
SELECT Docenti.Nome, Docenti.Cognome, Docenti.LuogoNascita, Città.Regione, Città.CodicePostale FROM Docenti INNER JOIN Città ON Docenti.LuogoNascita = Città.Città

Funzioni di aggregazione
Utili per effettuare calcoli, vediamone alcune:


Funzioni di gestione stringhe
LEFT() ;e RIGHT()
definiscono sottostringhe a partire, rispettivamente, dalla sinistra e dalla destra di una stringa.
SELECT LEFT/RIGHT(NomeCampo, length) FROM NomeTabella WHERE …
SELECT LEFT(Nome, 3) FROM Docenti WHERE ID = 1
Se al campo Nome del record con ID = 1 c’è scritto Andrea allora verranno prese solo le prime tre lettere, And.

LEN() calcola la lunghezza di una stringa.
SELECT LEN(NomeCampo) FROM NomeTabella WHERE …

TOP() estrae i primi N dati da una tabella.
SELECT TOP NomeCampo FROM NomeTabella
Gli Alias
Variabili che conterranno valori appena calcolati.
SELECT OPERAZIONI(parametri) AS NomeAlias FROM NomeTabella

GROUP BY e HAVING
GROUP BY è simile ad ORDER BY ma non ordina i dati in funzione di un campo bensì li raggruppa in funzione del campo specificato.
SELECT COUNT(*) AS quanti FROM Docenti GROUP BY ID
HAVING è simile a WHERE ma effettua operazioni utilizzando come clausole condizionali funzioni di aggregazione.
SELECT COUNT(*) AS quanti FROM Docenti HAVING MAX(Età) < 30
Metto in quanti la quantità di docenti con età inferiore a 30 anni.
Sarebbe uguale scrivere:
SELECT COUNT(*) AS quanti FROM Docenti WHERE Età < 30

Esempi query SQL

Access query SQL
Access esempi query SQL
  1. Numero di alunni che hanno preso almeno 12 nella ‘Seconda prova’
    SELECT Count(Distinct KsAlunno) from Esiti, Prove
    WHERE IdProva=KsProva And
    DescProva='Seconda prova' And Voto>=12;
  2. Quante volte è stata valutata almeno 12 una simulazione di Seconda prova
    SELECT Count(*) From Esiti, Prove
    WHERE IdProva=KsProva And
    DescProva='Seconda prova' And Voto>=12;
  3. Quanti alunni per ogni fascia di età (quanti quattordicenni, quindicenni ecc.)

    Fascia

    NumeroAlunni

    16

    2

    17

    2

    18

    1

    Select Eta As Fascia, Count(*) As 'NumeroAlunni' From Alunni
    Group By Eta;
  4. Nomi degli alunni più vecchi
    Select NomeAlu From Alunni
    Where Eta =  (Select Max(Eta) From Alunni);
  5. Elenco degli alunni che hanno preso in Italiano più della media
  6. Select Distinct NomeAlu From Alunni, Esiti, Prove
    Where IdAlunno=KsAlunno And IdProva=KsProva And
    DescProva=’Italiano' And Voto > (Select Avg(Voto)
    From Alunni, Esiti, Prove
    Where
    IdAlunno=KsAlunno And IdProva=KsProva And
    DescProva=’Italiano’);

Esempi query QBE

Crea una query di selezione semplice in:

Potrebbe interessarti leggere anche: #Access: come utilizzare le macro


Per saperne di più su Microsoft Access potrebbe interessarti questo libro:

Se vuoi approfondire alcuni dei temi trattati, visita la pagina con le mie pubblicazioni cartacee e online.

Se l'articolo ti è piaciuto, condividilo!

Segui l'hashtag #AndreaPacchiarotti