SQL: usare l’istruzione LIKE all’interno di una WHERE

comando like nell'istruzione Where del linguaggio SQL

Con il linguaggio SQL possiamo filtrare i dati con la clausola WHERE implementando con l’istruzione LIKE delle particolari condizioni di ricerca su colonne contenenti stringhe. In questo articolo studieremo alcune casistiche di utilizzo in SQL delle clausole WHERE  e LIKE, vedremo ad esempio come filtrare i dati in base all’inizio, al contenuto o alla fine di una cerca colonna di tipo stringa. L’articolo fa riferimento in particolare alla sintassi T-SQL del database SQL Server.

 

Utilizzo di LIKE all’interno di una condizione WHERE

Partiamo da tre semplici esempi: come estrarre i clienti il cui nome inizia, contiene, o termina con la lettera “a”.

Le tre rispettive condizioni-where saranno:

  • WHERE Nome LIKE ‘a%’
  • WHERE Nome LIKE ‘%a%’
  • WHERE Nome LIKE ‘%a’

Il carattere % può essere infatti utilizzato dopo l’istruzione LIKE per indicare la presenza di un numero qualsiasi di caratteri, zero compreso. Questo vuol dire che la seconda condizione

WHERE Nome LIKE ‘%a%’

estrae anche i nomi che iniziano e terminano con la “a”. È importante sottolineare che secondo le impostazioni di default le ricerche su SQL Server non sono case sensitive, di conseguenza non ha importanza se il carattere “a” sia maiuscolo o minuscolo, a meno di usare la clausola COLLATE (https://docs.microsoft.com/it-it/sql/t-sql/statements/collations?view=sql-server-ver16).

Per effettuare ricerche più complesse posso utilizzare ulteriori operatori di confronto. Ad esempio con la sintassi

WHERE Nome LIKE ‘_a%’

estraggo i nomi che hanno la lettera “a” in seconda posizione, mentre con

WHERE Nome LIKE ‘[^a]%’

i nomi che non iniziano con la “a”. Concludiamo infine il paragrafo con un ultimo esempio:

WHERE Nome LIKE ‘[ab]%[ao]’

estrae i nome che rispettano entrambe queste condizioni

  • iniziano con la a oppure con la b;
  • terminano con la a oppure con la o.

 

Impatto sulle performance dell’utilizzo di LIKE in una WHERE

In generale occorre fare attenzione a non usare eccessivamente l’istruzione LIKE se non strettamente necessario. Tuttavia è importante sottolineare un caso d’uso frequente dove l’utilizzo di LIKE è la scelta migliore dal punto di vista delle performance. Si tratta di tutte quelle condizioni scritte per estrarre le righe dove una particolare colonna inizia con una certa serie di caratteri.

Ad esempio, confrontiamo il piano d’esecuzione di queste due query in presenza di un indice sulla colonna Nome.

SELECT COUNT(*) 
FROM dbo.Clienti
WHERE LEFT(Nome,1) = 'N';
SELECT COUNT(*) 
FROM dbo.Clienti
WHERE Nome LIKE 'N%';

In entrambi i casi estraiamo i clienti il cui nome inizia con la lettera “N”, ma come mostrato dai relativi piani di esecuzione in basso, la seconda query è molto più performante.

Confronto performance in codice SQL con operatore LIKE nella condizione WHERE

Infatti scrivendo il filtro nella forma WHERE Nome LIKE ‘N%’, il piano d’esecuzione esegue una ricerca ottimizzata sull’indice (index seek), invece di una semplice scansione (index scan) come fatto nella prima query.

È importante sottolineare che questo non accade per altre tipologie di utilizzo del LIKE. Scrivendo ad esempio WHERE Nome LIKE ‘%N’ nel piano d’esecuzione apparirà l’operatore di scansione meno efficiente. Se vuoi approfondire il tema dei piani d’esecuzione puoi leggere il seguente articolo https://www.yimp.it/piano-di-esecuzione-di-una-query/.

 

Articoli correlati

Se sei interessato a studiare le clausole principali del linguaggio SQL puoi leggere i seguenti articoli:

Torna su