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 a 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))