Torna all'elenco degli articoli Articoli
Tempo di lettura: 10 minuti

Guida completa alla clausola WHERE di SQL

Imparate a usare la clausola WHERE di SQL per filtrare le righe. In questo articolo completo, trattiamo gli operatori di confronto e gli operatori BETWEEN, IN, LIKE, AND, OR e NOT.

Filtrare le righe di output è una delle prime cose da imparare quando si inizia il percorso in SQL. In questa guida vedremo come utilizzare la clausola WHERE di SQL per filtrare le righe in diversi scenari. Verranno illustrati i casi d'uso di base e quelli più avanzati.

La clausola WHERE in SQL

Immaginiamo che stiate lavorando a uno dei vostri primi progetti SQL e che stiate eseguendo le vostre prime query SQL. Conoscete già la sintassi di base dell'istruzione SELECT e sapete come recuperare colonne da una o due tabelle del database. Ma avete notato che molto spesso non avete bisogno di tutti i record di una tabella. Si vuole imparare a filtrare l'output in modo da restituire solo alcuni record che soddisfano determinati criteri.

Si vogliono solo i record corrispondenti a un cliente specifico? Oppure dovete recuperare l'elenco dei prodotti che sono poco disponibili (ad esempio, meno di 10 articoli)? O forse volete ottenere un elenco di rappresentanti di vendita che lavorano nella filiale X e che hanno registrato vendite superiori alla media nell'ultimo mese?

In tutti questi casi, è necessaria la clausola SQL WHERE per filtrare i risultati. Questa clausola introduce alcune condizioni, come:

  • quantity < 100
  • price BETWEEN 100 AND 500
  • customer_name = ‘John Smith’.

Affinché le condizioni di filtraggio vengano eseguite correttamente, la clausola WHERE deve essere posizionata dopo FROM e JOIN e prima di GROUP BY, HAVING e ORDER BY.

Ad esempio, ecco una query SQL per ottenere informazioni sui libri pubblicati dal 2020, ordinati in base al nome dell'autore:

SELECT b.title, a.name, b.year
FROM books b
JOIN authors a
ON books.author_id = authors.id
WHERE b.year >= 2020
ORDER BY a.name;

Si noti che abbiamo combinato le informazioni di due tabelle (books e authors) e abbiamo inserito la clausola WHERE dopo la condizione di unione ON e prima della clausola ORDER BY. Per saperne di più sulla sintassi corretta della clausola WHERE si può consultare questa guida per principianti.

Potrebbe anche essere una buona idea iniziare subito a fare pratica con WHERE. In questo caso, vi consiglio il nostro corso interattivo SQL Basics Il nostro corso interattivo. I 129 esercizi interattivi coprono i concetti chiave dell'SQL, comprese le condizioni semplici e complesse di WHERE.

Se volete prima avere una visione d'insieme, continuate ad esplorare gli operatori che potete usare nella clausola WHERE.

Operatori da utilizzare con SQL WHERE

In WHERE è possibile creare condizioni di filtraggio molto semplici e complesse, grazie a un'ampia gamma di operatori che possono essere utilizzati per confrontare i valori in SQL. Passiamo in rassegna quelli principali che consentono di filtrare per valori numerici, stringhe, valori NULL e un elenco di valori.

Valori numerici

Per i valori numerici è possibile utilizzare questi operatori di confronto:

  • = Uguale a.
  • != (o <>) Non uguale a.
  • < Meno di.
  • <= Minore o uguale a.
  • > Maggiore di.
  • >= Maggiore o uguale a.

Per vedere come funzionano questi operatori nella pratica, faremo alcuni esempi. Per i nostri esempi, utilizzeremo la seguente tabella che include informazioni sui venditori: ID, nome, cognome, stipendio annuale, percentuale di provvigione, provvigione ricevuta nel 2021 e ID della filiale.

salespeople
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
22DembeZuma400000.1231540.705
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502
37IanGarvey430000.08NULL1
38IvanStepanov410000.08NULL1

Per prima cosa, vogliamo ottenere i record di tutti i venditori il cui stipendio annuale è uguale o superiore a 50.000 dollari. Possiamo utilizzare la seguente query:

SELECT *
FROM salespeople
WHERE salary >= 50000;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
20ElisabethKeen590000.1445350.002
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502

Come previsto, abbiamo ottenuto l'elenco dei venditori il cui stipendio è uguale o superiore a 50.000 dollari.

Vediamo poi come utilizzare i numeri fluttuanti anziché gli interi con gli operatori di confronto. Elencheremo tutti i venditori che, grazie alla loro lunga esperienza nell'azienda, hanno un tasso di provvigione superiore a 0,12:

SELECT *
FROM salespeople
WHERE commission_rate > 0.12;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002

Poiché abbiamo usato l'operatore non inclusivo > nella clausola WHERE, abbiamo solo i venditori la cui percentuale di provvigione è strettamente superiore a 0,12. Questo esclude i venditori la cui percentuale è pari a 0,12. Questo esclude quelli la cui percentuale è uguale a 0,12.

Si noti inoltre che abbiamo usato gli operatori di confronto con i letterali (cioè 50000 e 0.12). Quando si filtrano i record, si possono usare anche gli operatori di confronto con le espressioni. Ad esempio, elenchiamo i venditori le cui provvigioni guadagnate nel 2021 sono state superiori al loro stipendio annuale:

SELECT *
FROM salespeople
WHERE commission_2021 > salary;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
18DonaldRessler400000.1441345.752
21TomKeen410000.1241560.751

La query ha funzionato come previsto; vediamo quattro venditori che apparentemente hanno registrato vendite molto elevate nel 2021, tanto che i loro guadagni da provvigione hanno superato il loro stipendio.

A questo punto, dovreste sentirvi più o meno a vostro agio con gli operatori di confronto mostrati sopra. È ora di introdurre un altro operatore che si può usare con i valori numerici in WHERE: l'operatore BETWEEN.

Per elencare tutti i venditori il cui tasso di commissione è compreso tra 0,10 e 0,14, è possibile utilizzare la seguente query:

SELECT *
FROM salespeople
WHERE commission_rate BETWEEN 0.10 AND 0.14;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
22DembeZuma400000.1231540.705
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502

Si noti che l'operatore BETWEEN è comprensivo di entrambi i limiti inferiore e superiore, quindi l'insieme dei risultati include i record corrispondenti alle percentuali di provvigione di 0,10 e 0,14.

Passiamo ora agli operatori che si possono usare con i valori di testo.

Valori di testo

Innanzitutto, con i valori di testo è possibile utilizzare la seguente serie di operatori di confronto che funzionano in modo simile con le stringhe come con i valori numerici, ma nel caso dei valori di testo, i record vengono ordinati e confrontati in ordine alfabetico:

  • = Uguale a.
  • != (o <>) Non uguale a.
  • < Meno di (si verifica prima in ordine alfabetico, cioè a < b).
  • <= Meno di o uguale a.
  • > Maggiore di (si verifica dopo in ordine alfabetico, cioè b > a).
  • >= -Maggiore o uguale a.

Per ottenere informazioni su tutti i venditori il cui cognome (ordinato alfabeticamente) è precedente a "Keen", si utilizzerà la seguente query:

SELECT *
FROM salespeople
WHERE last_name < ‘Keen’;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
35HaroldCooper570000.1015450.502
37IanGarvey430000.08NULL1

Questi operatori di confronto funzionano bene con i valori di testo. Tuttavia, è necessario includere sempre le virgolette nei letterali di stringa utilizzati nelle condizioni di WHERE (ad esempio, 'Keen'). Inoltre, mentre alcuni database non sono sensibili alle maiuscole e minuscole per impostazione predefinita (ad esempio SQL Server, MySQL), altri lo sono (ad esempio Oracle) e non restituirebbero alcun record se si cercasse 'keen' invece di 'Keen'.

Spesso abbiamo bisogno di una maggiore flessibilità con le stringhe che con i numeri, ed è qui che l'operatore LIKE ci viene in aiuto. Ci permette di fare dei filtri avanzati con i valori di testo, soprattutto se combinati con un carattere jolly SQL (ad esempio, '_' per un carattere mancante o '%' per un numero qualsiasi di caratteri).

Ad esempio, se vogliamo elencare tutti i venditori il cui cognome inizia per K, possiamo scrivere la seguente query SQL:

SELECT *
FROM salespeople
WHERE last_name LIKE ‘K%’;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
30KateKaplan540000.1025760.455

Leggete questo articolo se volete saperne di più su come i caratteri jolly SQL possono essere utilizzati per filtrare i record con valori di testo in SQL.

Confronti con valori NULL

La combinazione di operatori di confronto e valori NULL può mettere in crisi i principianti di SQL a causa di alcuni comportamenti controintuitivi. Ad esempio, se verifichiamo che un certo valore è uguale a NULL, il risultato sarà sconosciuto anche se il valore della colonna è NULL. Poiché la clausola WHERE richiede true condizioni, si otterranno zero righe con una condizione come la seguente:

SELECT *
FROM salespeople
WHERE commission_2021 = NULL;

Result:
Query has no result

La soluzione è utilizzare gli operatori IS NULL o IS NOT NULL. Ecco come recuperare tutti i record che hanno NULL nella colonna commision_2021:

SELECT *
FROM salespeople
WHERE commission_2021 IS NULL;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
37IanGarvey430000.08NULL1
38IvanStepanov410000.08NULL1

Consultate questa guida per ulteriori esempi del comportamento di NULL con vari operatori di confronto.

Operatore IN - Verifica di un elenco di valori

Infine, è possibile utilizzare l'operatore IN per verificare un elenco predefinito di valori. Ad esempio, si supponga di avere un elenco di dipendenti di cui occorre verificare le retribuzioni. È possibile recuperare i record necessari utilizzando una query SQL come questa:

SELECT *
FROM salespeople
WHERE last_name IN (‘Kaplan’, ‘Gerard’, ‘Zuma’);
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
22DembeZuma400000.1231540.705
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005

Sembra perfetta! Tuttavia, spesso ci sono alcune sfumature di sintassi da tenere presenti quando si utilizzano vari operatori nella clausola WHERE. Per comodità, abbiamo preparato una scheda informativa di 2 pagine su SQL Basics che include numerosi esempi di operatori utilizzati per filtrare l'output di una query SQL.

Combinazione di condizioni di filtraggio in WHERE

Nei compiti reali, una sola condizione nella clausola WHERE è spesso insufficiente. Fortunatamente, è possibile combinare diverse condizioni di filtraggio con gli operatori AND, OR e NOT:

  • L'operatore AND visualizza un record se tutte le condizioni sono vere.
  • L'operatore OR visualizza un record se una qualsiasi delle condizioni è vera.
  • L'operatore NOT visualizza un record se la condizione corrispondente non è vera.

Il funzionamento di questi operatori sarà più chiaro con alcuni esempi.

Per elencare tutti i venditori che lavorano nella filiale #5 e hanno uno stipendio pari o superiore a 50.000 dollari, utilizzare la seguente query:

SELECT *
FROM salespeople
WHERE branch_id = 5 AND salary >= 50000;

Per recuperare tutti i record in cui il cognome è "Kaplan" o "Reddington", utilizzare la seguente query:

SELECT *
FROM salespeople
WHERE last_name = ‘Kaplan’ OR last_name = ‘Reddington’;

Infine, per ottenere informazioni su tutti i venditori tranne quelli che lavorano nella filiale n. 2, utilizzare questa query:

SELECT *
FROM salespeople
WHERE NOT branch_id = 2;

Per ulteriori esempi di utilizzo di AND, OR e NOT, consultare questo articolo.

Per creare condizioni di filtraggio ancora più complesse, è possibile combinare più condizioni utilizzando AND, OR e NOT nella stessa dichiarazione WHERE. Tuttavia, è importante ricordare la precedenza di questi operatori in SQL: NON → E → O. Per una maggiore chiarezza, si consiglia di utilizzare le parentesi, anche se non sono necessarie in un caso specifico.

Supponiamo di voler recuperare tutti i record in cui il cognome di un dipendente è "Keen" o "Park", i suoi guadagni da provvigione sono stati superiori al suo stipendio nel 2021 e non lavora nella filiale #2. Ecco una possibile query:

SELECT *
FROM salespeople
WHERE (last_name = ‘Keen’ OR last_name = ‘Park’) 
AND (commission_2021 > salary)
AND (NOT branch_id = 2);
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
21TomKeen410000.1241560.751

E ora abbiamo finito con gli esempi! Se avete bisogno di ulteriori indicazioni sulla clausola WHERE con altri esempi, leggete le nostre guide per principianti. E poi, esercitatevi, esercitatevi e esercitatevi!

È ora di usare la clausola WHERE di SQL!

Il modo migliore per padroneggiare un nuovo concetto di SQL è provarlo in più query. Per i principianti, credo che l'ambiente più comodo per esercitarsi con qualcosa di nuovo sia quello dei corsi online interattivi: avete tutti gli esempi pronti per voi e potete scrivere le query comodamente dal vostro browser.

Per esercitarsi con SQL WHERE, consiglio di iniziare con il nostro corso interattivo. SQL Basics interattivo. Copre tutto ciò di cui avrete bisogno per iniziare a recuperare dati da un database, compresa la scrittura di sofisticate condizioni di filtraggio.

Per esercizi ancora più pratici, date un'occhiata alla SQL Practice percorso di apprendimento. Include 5 corsi interattivi con centinaia di sfide di codifica.

Grazie per aver letto e buon apprendimento!