Come si utilizza like e regexp in una query mysql

In una query Mysql devo utilizzare LIKE o REGEXP per cercare dei termini.

Quale è la differenza?

-

 

 

L'operatore LIKE e REGEXP

Vengono utilizzati in Mysql subito dopo la clausola WHERE, strettamente imparentati per eseguire query di ricerca ma con alcuni sostanziali differenze.

Infatti sia l'uno che l'altro vengono utilizzati in situazioni completamente diverse, in particolare:

  • LIKE viene utilizzato aggiungendo dei caratteri jolly ad una stringa
  • REGEXP viene utilizzato abbinato con espressioni regolari

Esempio di utilizzo con l'attributo LIKE :

SELECT * FROM table WHERE colonna LIKE '%stringa%';

Esempio di utilizzo con attributo REGEXP

SELECT citta FROM citta WHERE via REGEXP '^m';

In questo caso  con REGEXP verranno trovate tutte le occorrenze con iniziale "m"
es: Milano, Modena, Mantova....

 

Caratteri Jolly per LIKE

I caratteri jolly per  l'attributo LIKE sono % (percentuale) e _ (underscore), e vengono utilizzati in vari modi, ad esempio per trovare un occorrenza scrivendo parte di una stringa:

SELECT id, nome_articolo

FROM articoli

WHERE nome_articolo LIKE '%ggise%';

restituirà un query:

id: 123  nome articolo: Reggiseno Push-up

id: 136  nome articolo: Reggiseno sfoderato 

Con questo tipo di ricerca verranno restituiti tutti i valori che conterranno il termine ggise

Oppure

SELECT id, nome_articolo

FROM articoli

WHERE nome_articolo LIKE 'sfod%';

restituirà un query con gli articoli che inizieranno con la parola sfod

 id: 136  nome articolo: Reggiseno sfoderato 

Questa è una tabella che riporta un esempio pratico sull'utilizzo degli operatori %(percentuale) e _ (underscore) 

 

LIKE  Utilizzo
WHEREnome articolo LIKE 'a%' La query soddisfa i valori che iniziano con la lettera "a"
WHERE nome articolo LIKE '%a' La query soddisfa i valori che terminano con la lettera "a"
WHERE nome articolo LIKE '%ar%' La query soddisfa i valori con le lettere ar in qualsiasi posizione
WHERE nome articolo LIKE '_a%' La query soddisfa i valori che hanno  come secondo valore nella parola
WHERE nome articolo LIKE 'g_%' La query soddisfa i valori che iniziano con g con lungheza di almeno 2 caratteri
WHERE nome articolo LIKE 'w__%' La query soddisfa i valori che iniziano con w con lungheza di almeno 3 caratteri
WHERE nome articolo LIKE 'a%e' La query soddisfa i valori che iniziano con a e terminano con e

 

Utilizzare REGEXP per le query mysql

E' un altro operatore molto utile per trovare parole all'interno del nostro database mysql, e si distingue dall'altro operatore LIKE per la sua velocità nel trovare parole composte.

Il suo impiego è semplice e utilizza la potenza delle espressioni regolari  per eseguire query di un certo livello.

SELECT articoli FROM nome_articolo WHERE nome_articolo REGEXP 're|sfod';

In questo caso la nostra query restituirà:

 id: 136  nome articolo: Reggiseno sfoderato rosa

 id: 140  nome articolo: Reggiseno sfoderato blu

 

Sintassi dei caratteri speciali utilizzabili nelle espressioni regolari con REGEXP
 

^ Inizio della stringa o riga - es.  '^A' o  '^ABC'
$ Fine della stringa o riga - es. 'A$'
. Trova un carattere qualsiasi tranne il ritorno a capo \n
[Ab4-x] Uno dei caratteri tra parentesi
[^A] Un carattere che non è A
| Separatore di stringhe o caratteri corrisponde ad una espressione alternativa
* Corrisponde a 0 o più ripetizioni del carattere o dell'espressione precedente
+ Corrisponde a 1 o più ripetizioni del carattere o dell'espressione precedente.
{n} Trova n ripetizioni del carattere o dell'espressione precedente.
{min,max} Corrisponde da n a m ripetizioni del carattere o dell'espressione precedente.

 

 

La differenza di velocità di esecuzione tra l'operatore LIKE e REGEXP, nella prima risulta molti veloce utilizzando condizioni singole, mentre con il secondo attributo risulta molto veloce con query in condizioni multiple, es:

SELECT * FROM articoli
WHERE articolo LIKE '%stringa%'
OR articolo LIKE '%stringa%'
OR articolo LIKE '%stringa%';
RICERCA MOLTO LENTA

SELECT * FROM articoli
WHERE articolo REGEXP '((stringa)|(stringa))'; 
RICERCA VELOCE

 

Quindi in conclusione utilizzare l'operatore

 

LIKE = per condizioni singole (%stringa%)

REGEXP = per condizioni multiple ((stringa)|(stringa)|(stringa))

 


     


Lascia un commento