back to top

SQL SELECT – Interrogazione di una tabella

Eccoci arrivati ad una delle lezioni più importanti della nostra Guida, ovvero la lezione dedicata al comando SQL SELECT. Con l’istruzione SELECT di SQL possiamo effettuare delle interrogazioni al database per estrarne i dati in esso contenuti. Queste interrogazioni prendono il nome di query (in italiano, appunto, "interrogazione").

Estrarre i dati da una tabella

La sintassi base di una SELECT SQL è la seguente:

SELECT * FROM nome_tabella

dove il carattere asterisco (*) sta per tutti i campi della tabella.

Se non siamo interessati a tutti i campi ma solo ad alcuni abbiamo la possibilità di specificarli al posto dell’astersco, separando i nomi dei diversi campi con una virgola:

SELECT colonna1, colonna2, ... FROM nome_tabella

Di seguito un esempio pratico che riguarda la tabella "autori" creata nelle precedenti lezioni della nostra guida SQL:

SELECT * FROM autori

Questa query estrae tutti i campi (id, autore) dalla tabella.

Se avessimo voluto estrarre solo il nome dell’autore (e non anche l’id) avremmo utilizzato quest’altra query:

SELECT autore FROM autori

Filtrare i risultati con WHERE

Negli esempi precedenti abbiamo estratto ogni record presente nella tabella. Se la nostra tabella "autori" contiene 1.000 nomi la query precedente li avrebbe restituiti tutti quanti!

Quando i dati sono pochi potrebbe non essere un problema effettuare delle SELECT non filtrate ma al crescere del volume del database una simile prassi sarebbe senza dubbio deprecabile: non solo sarebbe poco pratica ma, allo stesso tempo, sarebbe molto "pesante" per i nostri terminali.

Al fine di porre rimedio a queste situazioni, il linguaggio SQL ha previsto la clausola WHERE che consente di filtrare il resultset (l’insieme dei record restituiti da una SELECT) impostanto specifiche condizioni.

Supponiamo, ad esempio, di voler estrarre unicamente il record corrispondente all’id 1. Per farlo utilizzeremmo la seguente query:

SELECT autore FROM autori WHERE id = 1

Il risultato sarà "J.R.R. Tolkien", cioè il nome dell’autore corrispondente all’id 1.

Ovviamente la ricerca per id non è che uno delle tantissime possibilità offerte da WHERE! Supponiamo, ad esempio, di non conoscere l’id dell’autore "J.R.R. Tolkien". Per ricavarlo useremmo la seguente query:

SELECT id FROM autori WHERE autore = 'J.R.R. Tolkien'

Come abbiamo già visto nella lezione dedicata ad INSERT INTO, trattadosi di valore testuali abbiamo utilizzato gli apici per racchiudere la stringa.

Sino ad ora abbiamo visto come effettuare ricerche solo utilizzando l’operatore di eguaglianza. Nel proseguo della lezione vedremo come creare query più complesse ed articolate.

Effettuare ricerche testuali con l’operatore LIKE

Proviamo ora a fare una ricerca più complessa: supponiamo di voler estrarre tutti i titoli dalla tabella "libri" dove il titolo inizia per "I" utilizzando l’operatore LIKE per effettuare una ricerca attraverso un pattern specifico:

SELECT titolo FROM libri WHERE titolo LIKE 'I%'

Il simbolo della percentuale (%) è un "carattere speciale" e indica una qualsiasi stringa, quindi LIKE 'I%' intercetta qualsiasi testo che inizia con "I".

L’operatore LIKE sfrutta la potenzialità di due caratteri speciali, cioè % (percentuale) e _ (underscore o trattino basso).

  • la percentuale (%) indica qualsiasi stringa;
  • il trattino basso (_) indica un qualsiasi carattere.

Facciamo qualche esempio:

WHERE titolo LIKE ‘a%’Trova le stringhe che iniziano con "a"
WHERE titolo LIKE ‘%a’Trova le stringhe che finiscono con "a"
WHERE titolo LIKE ‘%anelli%’Trova le stringhe che contengono la stringa "anelli"
WHERE titolo LIKE ‘a_’Trova le stringhe di 2 caratteri che iniziano con "a"
WHERE titolo LIKE ‘a__’Trova le stringhe di 3 caratteri che iniziano con "a"
WHERE titolo LIKE ‘__a’Trova le stringhe di 3 caratteri che finiscono con "a"

IL DBMS MS Access ha una sintassi leggermente diversa per LIKE: al posto del carattere percentuale usa l’asterisco (*) e al posto del trattino basso utilizza il punto di domanda (?).

Torando al nostro esempio, la query in MS Access sarebbe così:

SELECT titolo FROM libri WHERE titolo LIKE 'I*'

Utilizzare gli operatori di confronto per ricerche tra valori numerici

Proviamo ad effettuare quattro ricerche utilizzando come discriminante il valore del campo "prezzo". Per prima cosa supponiamo di cercare libri con un prezzo inferiore a 50 euro:

SELECT * FROM libri WHERE prezzo < 50

Oppure libri con un prezzo superiore a 50 euro:

SELECT * FROM libri WHERE prezzo > 50

Oppure, ancora, libri con un prezzo diverso da 50 euro:

SELECT * FROM libri WHERE prezzo != 50

In MS Access, come abbiamo detto nella lezione dedicata, l’operatore di disuguaglianza è <>:

SELECT * FROM libri WHERE prezzo <> 50

Per i campi numerici un costrutto particolare è BETWEEN che consente di selezionare i valori compresi tra un minimo ed un massimo. Vediamo un esempio come estrapolare i libri con un prezzo compreso tra 20 e 60 euro:

SELECT * FROM libri WHERE prezzo BETWEEN 20 AND 60

Utilizzare gli operatori logici per ricerche più complesse

Negli esempi visti sino ad ora abbiamo mostrato come effettuare ricerche semplici, basate cioè su un unico fattore. In realtà SQL ci consente di effettuare ricerche complesse utilizzando gli operatori logici AND, OR e NOT.

Vediamo come utilizzare AND all’interno della clausola WHERE:

SELECT * FROM libri WHERE prezzo < 50 AND disponibile = 1

Questa query estrarrà tutti i libri che costano meno di 50 euro e che sono attualmente disponibili.

Se avessimo scritto:

SELECT * FROM libri WHERE id_autore = 1 OR id_autore = 3

Il risultato della query sarà di mostrare tutti i libri associati indifferentemente all’autore id 1 o all’autore con id 3.

Ovviamente nulla vieta di comporre ricerche complesse che fanno uso sia di AND che di OR. Per farlo sarà necessario utilizzare le parantesi come nell’esempio che segue:

SELECT * FROM libri WHERE prezzo < 50 AND (id_autore = 1 OR id_autore = 3)

Questa istruzione SQL andrà a selezionare tutti i libri con un prezzo inferiore a 50 Euro che siano stati associati all’autore id 1 o all’autore con id 3.

Per finire vediamo come utilizzare l’operatore NOT il quale esprime le sue potenzialità soprattutto nelle ricerche che coinvolgono campi NULL o TRUE (per i database che supportino campi booleani). Vediamo un esempio:

SELECT * FROM libri WHERE disponibile IS NOT TRUE

Questa query mostrerà tutti i libri non disponibili.

Pubblicitร