Clausola WHERE in SQL

Come abbiamo visto nella lezione precedente, l'istruzione SELECT permette di selezionare i dati presenti in una tabella. Se invece vogliamo ottenere solo le righe che rispettano determinate condizioni, possiamo utilizzare la clausola WHERE.

Clausola WHERE

La clausola WHERE in SQL permette di filtrare le righe restituite da una query. La sintassi da utilizzare è la seguente:

SELECT colonne FROM tabella WHERE condizione;

Quando si utilizza la clausola WHERE, SQL controlla se la condizione è vera per ogni riga e restituisce solo quelle per cui la condizione è vera.

Ad esempio, se vogliamo restituire solo gli utenti che vivono a Milano:

SELECT nome, cognome FROM utenti
WHERE citta = 'Milano';

Ricorda che, come per AS, WHERE non modifica i dati della tabella. Nelle condizioni in WHERE possono essere usate colonne, valori o operatori di confronto. 

Operatori di confronto

Per stabilire quali condizioni devono essere rispettate dalle righe che vogliamo ottenere, utilizziamo gli operatori di confronto.

Gli operatori di confronto permettono, ad esempio, di verificare se un valore è uguale, diverso, maggiore o minore rispetto a un altro valore.

Gli operatori di confronto in SQL sono:

Operatore Descrizione
= Uguale a...
<>, != Diverso da...
> Maggiore di...
< Minore di...
>= Maggiore o uguale di...
<= Minore o uguale di...

Operatore =

L'operatore = permette di verificare se il valore di una colonna è uguale a quello specificato nella condizione.

Per esempio, possiamo selezionare gli utenti che hanno 25 anni:

SELECT * FROM utenti
WHERE eta = 25;

In questo caso, verranno restituite soltanto le righe in cui il valore della colonna eta è esattamente 25.

Operatore <> e !=

Gli operatori <> e != vengono utilizzati per verificare che un valore sia diverso da quello specificato.

Per esempio:

SELECT * FROM utenti
WHERE eta <> 25;

Questa query restituisce tutti gli utenti che non hanno 25 anni.

In MySQL è possibile ottenere lo stesso risultato utilizzando !=:

SELECT * FROM utenti
WHERE eta != 25;

I due operatori sono equivalenti in questo caso. La sintassi <> è quella più tradizionalmente associata allo standard SQL, mentre != è più simile a JavaScript.

Operatori > e <

L'operatore > verifica se un valore è maggiore di un altro, mentre l'operatore < verifica se un valore è minore di quello indicato.

Ad esempio:

SELECT * FROM utenti
WHERE eta > 25;

In questo caso verranno restituiti soltanto gli utenti che hanno eta superiore a 25. Con questa istruzione, un utente con età esattamente pari a 25 non soddisfa la condizione.

Operatori >= e <=

Se vogliamo includere anche il valore indicato, possiamo utilizzare gli operatori >= e <=.

Ad esempio, la seguente query restituisce gli utenti con un'età maggiore o uguale a 25:

SELECT * FROM utenti 
WHERE eta >= 25;

Combinare condizioni con AND, OR e NOT

Una condizione WHERE può essere sufficiente per filtrare i dati, ma spesso abbiamo bisogno di verificare più condizioni contemporaneamente.

Per combinare diverse condizioni possiamo utilizzare gli operatori logici AND, ORe NOT.

Operatore AND

L'operatore AND permette di combinare due o più condizioni. Una riga viene restituita solo se tutte le condizioni sono vere.

Ad esempio, selezioniamo soltanto gli utenti che sono maggiorenni e vivono a Milano:

SELECT * FROM utenti
WHERE eta >= 18 AND citta = 'Milano';

In questo caso devono essere vere entrambe le condizioni:

  • L'utente deve avere almeno 18 anni.
  • L'utente deve vivere a Milano.

Con AND puoi anche combinare più di due condizioni.

Operatore OR

L'operatore OR viene utilizzato quando è sufficiente che almeno una delle condizioni sia vera.

Per esempio:

SELECT * FROM utenti
WHERE citta = 'Milano' OR citta = 'Roma';

La query nell'esempio restituisce gli utenti che vivono a Milano oppure a Roma.

In questo caso, quindi, non è necessario che entrambe le condizioni siano vere: è sufficiente che ne venga soddisfatta una.

Possiamo utilizzare OR anche per condizioni diverse:

SELECT * FROM utenti
WHERE eta > 30 OR citta = 'Roma';

Operatore NOT

L'operatore NOT permette di negare una condizione, cioè di selezionare le righe per cui quella condizione non è vera.

Ad esempio, la query seguente restituisce tutti gli utenti che non vivono a Milano:

SELECT * FROM utenti
WHERE NOT citta = 'Milano';

In questo caso possiamo ottenere lo stesso risultato anche utilizzando l'operatore <>:

SELECT * FROM utenti
WHERE citta <> 'Milano';

Precedenza delle operazioni

Quando una query contiene più condizioni con AND, OR e NOT, è importante sapere in quale ordine vengono valutate.

In particolare, AND ha una precedenza maggiore rispetto a OR. Questo significa che, in assenza di parentesi, SQL valuta prima le condizioni collegate da AND.

Consideriamo questa query:

SELECT * FROM utenti
WHERE eta >= 18 AND citta = 'Milano' OR citta = 'Roma';

Potrebbe sembrare che SQL valuti le condizioni semplicemente da sinistra verso destra, ma non è così. La query viene interpretata come se fosse scritta in questo modo:

SELECT * FROM utenti
WHERE (eta >= 18 AND citta = 'Milano')
  OR citta = 'Roma';

Quindi verranno restituiti:

  • Gli utenti maggiorenni che vivono a Milano.
  • Tutti gli utenti che vivono a Roma, indipendentemente dalle loro età.

Se invece vogliamo selezionare esclusivamente gli utenti maggiorenni che vivono a Milano oppure a Roma, dobbiamo utilizzare le parentesi:

SELECT * FROM utenti
WHERE eta >= 18 AND (citta = 'Milano' OR citta = 'Roma');

Le parentesi fanno sì che citta = 'Milano' OR citta = 'Roma' venga valutato prima. Il risultato sarà quindi composto esclusivamente dagli utenti che hanno almeno 18 anni e vivono in una delle due città.

Prova!Completa gli spazi vuoti con il testo appropriato.
-- Seleziona gli utenti che vivono a Milano o a Roma
SELECT * FROM utenti
citta = 'Milano' citta = 'Roma';

Prova!Scegli l'opzione corretta tra quelle elencate.
-- Seleziona gli utenti che non vivono a Milano
SELECT * FROM utenti WHERE citta __ 'Milano';