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
- Segui la lezione successiva sulla JOIN tra tabelle
- Torna all’indice delle lezioni
- Visita la pagina del mio video corso online di SQL