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

Come scrivere una clausola WHERE in SQL

Spieghiamo come utilizzare la clausola WHERE di SQL con esempi pratici. Se avete appena iniziato a imparare l'SQL e volete sapere come recuperare o lavorare solo con una parte specifica dei dati memorizzati nelle vostre tabelle, questo articolo fa per voi!

La clausola SQL WHERE è un elemento da padroneggiare se si desidera utilizzare SQL per lavorare con i dati. È probabilmente uno dei costrutti più basilari e da imparare di SQL.

Nella mia esperienza, infatti, non ho quasi mai trovato query di recupero o manipolazione dei dati che non utilizzassero la clausola WHERE. Filtrare i dettagli dei dipendenti appartenenti a un particolare reparto, selezionare gli ordini con valori superiori a un certo importo o ottenere un elenco di clienti appartenenti a una specifica regione geografica richiedono tutti l'uso della clausola WHERE in un modo o nell'altro nelle query.

Domanda: Che cos'è l'SQL Where?

La clausola SQL WHERE filtra i record in base a condizioni specifiche; consente di recuperare, modificare o eliminare selettivamente i dati in un database. È fondamentale per individuare righe esatte nelle operazioni SELECT, UPDATE, o DELETE.

Naturalmente, questi sono solo alcuni esempi. In generale, è possibile utilizzare la clausola SQL WHERE per filtrare qualsiasi riga delle tabelle.

Quindi, senza ulteriori indugi, iniziamo subito!

Sintassi di base di una query SQL con clausola WHERE

La sintassi di base di una query SQL che utilizza la clausola WHERE è la seguente:

SELECT <column names>
FROM <table name>
WHERE <conditions>;

La clausola WHERE segue le clausole SELECT e FROM. Mentre la clausola SELECT specifica le colonne da restituire dalla/e tabella/e, la clausola WHERE contiene le condizioni che devono essere valutate come vere affinché una riga sia restituita come risultato. Ogni condizione viene valutata per ogni riga restituita dalla/e tabella/e. SQL dispone di una serie di operatori condizionali per specificare come filtrare le righe necessarie.

Per spiegarlo meglio, vi presentiamo alcuni esempi di SQL WHERE.

La clausola WHERE di SQL con una singola condizione

Immaginate di lavorare in una multinazionale con uffici in tutto il mondo. I dettagli di questi uffici sono memorizzati in un database, in una tabella chiamata offices.

La offices tabella:

office_codecitystatecountrypostal_codeterritory
1San FranciscoCAUSA94080NA
2BostonMAUSA02107NA
3NYCNYUSA10022NA
4ParisNULLFrance75017EMEA
5TokyoChiyoda-KuJapanNULLJAPAC
6SydneyNULLAustraliaNSW-2010JAPAC
7LondonNULLUKEC2N 1HNEMEA

Ora, supponiamo di voler ottenere un elenco degli uffici negli Stati Uniti. La query si presenta in questo modo:

SELECT *
FROM offices
WHERE country = 'USA';

L'output:

office_codecitystatecountrypostal_codeterritory
1San FranciscoCAUSA94080NA
2BostonMAUSA02107NA
3NYCNYUSA10022NA

Per questa query, SQL valuta prima ogni riga e confronta il valore della colonna country con 'USA'. Quindi restituisce solo le righe per le quali la condizione è vera. Nel nostro caso, abbiamo tre righe in cui il paese è USA.

(A questo punto, se non vi è chiaro come scrivere le query, vi invito a seguire il corso SQL Basic di LearnSQL.it. Non solo è ben strutturato, ma contiene anche alcuni fantastici esercizi per alimentare il vostro apprendimento e la vostra crescita).

È inoltre possibile utilizzare operatori di confronto come >, <, >=, <= e <> per confrontare i valori. Per esempio, supponiamo di voler recuperare solo le righe in cui office_code è superiore a 5.

La query:

SELECT *
FROM offices
WHERE office_code > 5;

L'output:

office_codecitystatecountrypostal_codeterritory
6SydneyNULLAustraliaNSW-2010APAC
7LondonNULLUKEC2N 1HNEMEA

Oppure, se si vogliono recuperare tutte le righe in cui territory non è 'NA', la query si presenta in questo modo:

SELECT *
FROM offices
WHERE territory <> 'NA';

L'output:

office_codecitystatecountrypostal_codeterritory
4ParisNULLFrance75017EMEA
5TokyoChiyoda-KuJapanNULLJAPAC
6SydneyNULLAustraliaNSW-2010JAPAC
7LondonNULLUKEC2N 1HNEMEA

La clausola WHERE dell'SQL con condizioni multiple

Finora abbiamo trattato esempi molto semplici di query che illustrano l'uso di una clausola WHERE SQL con una sola condizione. Tuttavia, quando si scrivono query pratiche e reali, spesso si utilizza più di una condizione per ottenere i risultati desiderati.

Uso degli operatori condizionali

SQL dispone degli operatori condizionali AND, OR e NOT per espandere il numero di condizioni utilizzate in una query. È possibile collegare le condizioni utilizzando l'operatore AND quando si desidera ottenere solo le righe che soddisfano tutte le condizioni. Al contrario, si utilizza l'operatore OR quando si desidera recuperare tutte le righe per le quali almeno una delle condizioni è vera.

Ad esempio, se si vogliono ottenere le città e i paesi di tutti gli uffici del Regno Unito o della Francia. Come si può intuire, a tale scopo si utilizza l'operatore OR.

La query:

SELECT city, country
FROM offices
WHERE country = 'UK'
  OR country = 'France';

L'output:

citycountry
ParisFrance
LondonUK

In questo caso, SQL restituisce le righe per le quali una o entrambe le condizioni sono vere. In pratica, esiste un modo migliore per scrivere questa query utilizzando l'operatore IN.

Uso dell'operatore IN

L'operatore IN consente di specificare un elenco di valori da controllare. Si veda la seguente query:

SELECT city, country
FROM offices
WHERE country IN ('UK', 'France');

L'output:

citycountry
ParisFrance
LondonUK

Vengono restituite tutte le righe i cui Paesi sono presenti nell'elenco dei valori specificati (nel nostro caso, Regno Unito e Francia).

Con l'operatore IN è possibile specificare un elenco di molti valori, non solo due.

Si utilizza l'operatore NOT IN per restituire le righe i cui valori non sono presenti nell'elenco. Ad esempio, è possibile ottenere i codici postali di tutti gli uffici che non si trovano nel territorio JAPAC o EMEA.

Uso dell'operatore IN in una sottoquery

Un altro modo per utilizzare l'operatore IN è con una subquery per generare un elenco da un'altra tabella. Per capire meglio, immaginiamo di avere un'altra tabella che contiene i ricavi di ogni ufficio.

La tabella office_revenue tabella:

office_coderevenue
1100002
2232221
3545556
4543432
5765678
6433433
7123245

Si vuole sapere quali sono gli uffici che non generano entrate sufficienti e si definiscono quelli con entrate inferiori a 200.000 euro. Ciò significa che è necessario trovare le città degli uffici con meno di 200.000 entrate.

La query:

SELECT city
FROM offices
WHERE office_code IN (SELECT office_code
  FROM  office_revenue
  WHERE revenue < 200000);

L'output:

city
San Francisco
London

In questa query, SQL elabora innanzitutto la sottoquery per restituire un elenco dei codici degli uffici con ricavi inferiori a 200.000. I codici degli uffici presenti nella tabella offices vengono quindi confrontati con questo elenco per restituire le righe corrispondenti a quelle dell'elenco.

Condizioni più complesse

Proviamo a fare un esempio un po' più complesso.

Cosa succede se si vogliono ottenere i codici degli uffici e le città di tutti gli uffici che si trovano nel territorio JAPAC o EMEA, hanno codici postali che non sono NULL, non hanno uno stato specificato e hanno codici ufficio maggiori o uguali a 5?

Un buon approccio alla scrittura di questa query consiste nell'isolare le condizioni una per una e nel mettere in relazione ciascuna di esse con le colonne disponibili:

  • territory è JAPAC o EMEA.
  • postal_code non è NULL.
  • Lo stato è NULL o vuoto.
  • office_code è maggiore o uguale a 5.

Ora che si conoscono le condizioni, la scrittura della query diventa semplice. Si noti che tutte le condizioni devono essere soddisfatte affinché venga restituita una riga.

La query:

SELECT office_code, city
FROM offices
WHERE territory IN ('JAPAC', 'EMEA')
AND postal_code IS NOT NULL
AND (state IS NULL OR state = '')
AND office_code >= 5;

L'output:

office_codecity
6Sydney
7London

Le condizioni vengono valutate nel modo seguente. Con la prima condizione, SQL restituisce solo le righe i cui territori sono JAPAC o EMEA. Tra queste righe, controlla se il codice postale è NULL. Poi considera la terza condizione, in cui si usano le parentesi. Le due condizioni tra le parentesi vengono valutate per ottenere un risultato collettivo: controlla il valore della colonna state e restituisce true quando è blank o NULL. Infine, l'ultima condizione filtra le righe con office_code maggiore o uguale a 5. Di conseguenza, nel risultato vengono restituiti solo gli uffici di Sydney e Londra.

Si noti che non viene utilizzato postal_code <> NULL or state = NULL. Abbiamo invece utilizzato gli operatori IS NOT e IS per filtrare i valori con NULL. Questo perché NULL è qualcosa di sconosciuto o inesistente e quindi non può essere equiparato a un altro valore. SQL non lancia un errore se si utilizzano = o <>, ma riceve come risultato un insieme vuoto e non viene restituita alcuna riga. Questo è ovviamente sbagliato.

Supponiamo di avere lo stesso requisito, solo che ora si vogliono ottenere tutti i codici ufficio maggiori o uguali a 4 ma minori o uguali a 6. A questo scopo si può utilizzare l'operatore BETWEEN.

La query:

SELECT office_code, city
FROM offices
WHERE territory IN ('JAPAC', 'EMEA')
AND postal_code IS NOT NULL
AND (state is NULL OR state ='')
AND office_code BETWEEN 4 AND 6;

L'output:

office_codecity
4Paris
6Sydney

L'operatore BETWEEN controlla un intervallo di valori compreso tra 4 e 6, inclusi i limiti. Ora vengono restituite due righe: Parigi e Sydney.

Cosa non si può usare in una clausola WHERE

Non è possibile usare funzioni aggregate direttamente in una clausola WHERE. Questo perché le condizioni in una clausola WHERE vengono valutate riga per riga, mentre le funzioni aggregate lavorano su più righe per restituire un unico risultato.

Si consideri questo esempio. Si vogliono restituire tutti i codici ufficio il cui fatturato è superiore alla media. Forse il primo istinto è quello di scrivere qualcosa di simile:

SELECT office_code
FROM office_revenue
WHERE revenue > AVG(revenue);

Tuttavia, questa query restituisce un errore:

ERROR 1111 (HY000): Invalid use of group function

Per filtrare i record con le funzioni aggregate è possibile utilizzare una sottoquery. Date un'occhiata:

SELECT office_code, revenue
FROM office_revenue
WHERE revenue > (SELECT AVG(revenue)
		     FROM office_revenue);

L'output:

office_coderevenue
3545556
4543432
5765678
6433433

In questa query, SQL recupera innanzitutto il ricavo medio dalla subquery. Quindi confronta questo valore con le entrate di ogni riga, restituendo solo i codici ufficio con entrate corrispondenti superiori al valore medio.

Siete pronti a utilizzare la clausola WHERE di SQL nelle vostre query?

Dopo aver letto l'articolo, ora avete un'idea di come utilizzare la clausola SQL WHERE. Le query fornite in questo articolo sono di base e vanno bene per un principiante.

Se avete iniziato da poco il vostro percorso di apprendimento di SQL e desiderate accelerare la vostra crescita, vi consiglio questo brano di LearnSQL.it. Preferisco questa traccia per la sua completezza per chi è alle prime armi con SQL.

Costituisce un'ottima base per un analista - o per chiunque utilizzi SQL - e fornisce una buona base per la scrittura di query da utilizzare quotidianamente per raccogliere informazioni dai dati.

Ma una cosa che non potrò mai sottolineare abbastanza è la necessità di fare pratica e di essere coerenti. Questo rafforza tutto l'apprendimento. Potete iniziare scrivendo 10-20 query al giorno come pratica; in 3 mesi avrete scritto quasi 1.800 query!

Il bello di SQL è che è semplice e potente allo stesso tempo. Quindi, cosa state aspettando? Sporcatevi subito le mani!!!