SQL WHERE: come scrivere condizioni in SQL per filtrare i dati di una tabella

La clausola Where del linguaggio SQL permette di scrivere query per visualizzare soltanto le righe di una tabella che rispettano una particolare condizione. In questo articolo vedremo una serie di esempi di utilizzi della WHERE all’interno di query SQL di complessità crescente.

Query SQL con la condizione WHERE

Consideriamo questo primo esempio:

“Visualizzare nome, cognome e regione di residenza dei clienti residenti in Lombardia.”

Scriveremo la query

SELECT Nome, 
       Cognome, 
       RegioneResidenza
FROM   Clienti
WHERE  RegioneResidenza = 'Lombardia';

Per inserire il filtro abbiamo usato dunque la parola chiave WHERE. Osserviamo che la parola ‘Lombardia’ è racchiusa tra apici. Se non usassimo gli apici, il codice restituirebbe un errore perché andrebbe a cercare i valori contenuti all’interno di un’ipotetica colonna di nome Lombardia.

Facciamo un passo in più risolvendo un problema leggermente più complesso.

“Visualizzare nome, cognome e regione di residenza dei clienti residenti in Lombardia e che si chiamano Alberto.”

In questo caso scriveremo

SELECT Nome, 
       Cognome, 
       RegioneResidenza
FROM   Clienti
WHERE  RegioneResidenza = 'Lombardia'
   AND Nome = 'Alberto';

Quando inserisco più condizioni, queste devono essere connesse con un AND oppure con un OR in base alla richiesta dell’esercizio.

L’operatore IN all’interno di una WHERE

Vediamo un nuovo esercizio:

“Estrarre nome e cognome dei clienti numero 1 e 5.”

Per quanto semplice, questo esercizio ci permette di fare parecchie riflessioni. La query risolutiva sarà:

SELECT Nome, 
       Cognome
FROM   Clienti
WHERE  IdCliente = 1
    OR IdCliente = 5;

Per prima cosa notiamo che quando scriviamo condizioni con valori numerici non dobbiamo utilizzare gli apici. Scriviamo dunque semplicemente IdCliente = 1, invece di IdCliente = ‘1’. Osserviamo inoltre che nella lingua parlata è naturale usare  la congiunzione “e”  in frasi come quella dell’esercizio. Ma quando programmiamo dobbiamo sempre tradurre queste casistiche utilizzando l’operatore OR in quanto nessuna riga conterrà contemporaneamente il valore 1 e 5 (perché banalmente c’è posto per un solo valore).

Possiamo riscrivere il codice precedente in modo più veloce con il costrutto IN:

SELECT Nome, 
       Cognome
FROM   Clienti
WHERE  IdCliente IN (1,5);

Condizioni su date

Consideriamo ora quest’esempio:

“Visualizzare tutte le colonne delle fatture emesse dal giorno 1 gennaio 2018 in poi.”

La colonna DataFattura è di tipo date. Scriveremo dunque

SELECT *
FROM   Fatture
WHERE  DataFattura >= '20180101';

Quando scriviamo filtri su colonne di tipo “date“, ricordiamoci di scrivere le date nel formato internazionale e standard AAAAMMDD. Per approfondire la sintassi da utilizzare per le colonne datetime (che contengono anche l’orario) puoi leggere questo mio articolo https://www.yimp.it/sql-server-filtro-campi-datetime/

L’esempio mette in luce la possibilità di utilizzare vari operatori di confronto all’interno della WHERE, tra cui =, >, <, >=, <= e <>. 

Filtriamo su funzioni applicate a una colonna

Vediamo come estrarre le fatture emesse nel 2018.

SELECT *
FROM   Fatture
WHERE  YEAR(DataFattura) = 2018;

Osserviamo che la colonna DataFattura contiene l’intera data, non solo l’anno. Sarebbe sbagliato dunque scrivere la query in questo modo

SELECT *
FROM   Fatture
WHERE  DataFattura = 2018;

Nella query corretta abbiamo invece applicato a DataFattura la funzione YEAR. Essa ha lo scopo di convertire una data nel numero intero corrispondente al relativo anno (https://www.sqlservertutorial.net/sql-server-date-functions/sql-server-year-function/). Osserviamo che la query precedente può essere riscritta in questo modo, evitando l’uso della funzione YEAR.

SELECT *
FROM   Fatture
WHERE  DataFattura >= '20180101'
   AND DataFattura < '20190101';

In alcuni casi scrivere codice che non utilizzi funzioni potrebbe portare a dei miglioramenti delle performance. Evitiamo invece di scrivere la query precedente così:

SELECT *
FROM   Fatture
WHERE  DataFattura >= '20180101'
   AND DataFattura <= '20181231';

perché potenzialmente potrebbe portare a dei risultati errati se la colonna DataFattura contenesse informazioni anche su ore minuti e secondi di registrazione.

WHERE e NULL in SQL

In generale occorre fare molta attenzione alla gestione dei NULL all’interno della condizione WHERE di una query SQL. Ad esempio le due query seguenti sono “errate” perché restituiranno sempre zero righe

SELECT *
FROM   Fatture
WHERE  IVA = NULL;
SELECT *
FROM   Fatture
WHERE  IVA <> NULL;

Per filtrare le righe con o senza NULL bisogna utilizzare IS NULL oppure IS NOT NULL

SELECT *
FROM   Fatture
WHERE  IVA IS NOT NULL;
SELECT *
FROM   Fatture
WHERE  IVA IS NULL;

Possiamo osservare inoltre che le fatture con IVA null non vengono estratte da query che utilizzano l’operatore di confronto <> (diverso da) come la seguente

SELECT *
FROM   Fatture
WHERE  IVA <> 20;

Continua a imparare

Torna in alto
Torna su