26th Jun 2024 Tempo di lettura: 9 minuti Come scrivere una clausola WHERE in SQL Himanshu Kathuria sql imparare sql where Indice Sintassi di base di una query SQL con clausola WHERE La clausola WHERE di SQL con una singola condizione La clausola WHERE dell'SQL con condizioni multiple Uso degli operatori condizionali Uso dell'operatore IN Uso dell'operatore IN in una sottoquery Condizioni più complesse Cosa non si può usare in una clausola WHERE Siete pronti a utilizzare la clausola WHERE di SQL nelle vostre query? 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!!! Tags: sql imparare sql where