Saiba como usar o operador REGEXP e expressões regulares para efetuar um casamento de padrões, em vez de uma comparação literal.
O uso de padrões SQL são implementados por outros sistemas de bancos de dados — o que os torna facilmente portáveis além do MySQL.
Por outro lado, são um tanto limitados.
Um exemplo desta limitação é que é fácil criar um padrão SQL %abc%
para encontrar um string que contenha “abc” — mas é muito difícil criar um padrão que identifique strings contendo um destes caracteres “a”, “b” ou “c”.
Para este tipo de operação (e muitas outras), o MySQL provê suporte a um outro tipo de casamento de padrões, baseado em expressões regulares (ou regular expressions) e o operador REGEXP (ou NOT REGEXP).
As operações pelo REGEXP usam elementos diferentes dos operadores ‘%’ e ‘_’ (veja o link no final) — que não têm muita importância aqui.
O MySQL usa a implementação de Henry Spencer, que está de acordo com o POSIX 1003.2. O banco de dados usa a versão estendida para dar suporte a operações de casamento de padrões executadas pelo operador REGEXP nas declarações SQL.
Opcionalmente, é possível usar o operador RLIKE, que é sinônimo de REGEXP — presente para manter compatibilidade com o mSQL (miniSQL), o que facilita a portabilidade entre os dois sistemas.
Conheça os padrões na tabela abaixo:
Padrão | O que ele reconhece |
---|---|
^ | O início de uma string. |
$ | O fim de uma string. |
. | Todo e qualquer caractere. |
[…] | Todo caractere incluido entre os colchetes. |
[^…] | Qualquer caractere que não esteja incluído entre os colchetes. |
p1|p2|p3 | Operador de alternância; encontra quaisquer padrões que sejam p1, p2 ou p3. |
* | Nenhuma ou mais das instâncias do elemento precedente. |
+ | Uma ou mais das instâncias do elemento precedente. |
{n} | n instâncias do elemento precedente |
{m,n} | de m a n instâncias do elemento precedente. |
Esta tabela será melhor entendida a partir do momento em que forem dados alguns exemplos de uso dos operadores. Por enquanto, guarde-a para consulta.
Usuários mais avançados do Unix ou GNU/Linux podem estar familiarizados com o uso de caracteres de padrão de expressões regulares. Programadores Perl, PHP e Python, provavelmente também.
No artigo Como encontrar padrões entre os seus dados no MySQL mostrei como encontrar substrings no começo ou no fim de uma cadeia de caracteres (string) ou em uma posição aribtrária ou específica dentro de uma string.
O mesmo pode ser feito com expressões regulares.
Exemplos de uso de expressões regulares, para encontrar informações no MySQL
Daqui pra frente, vamos ver como fazer uso dos operadores, expostos na tabela.
O exemplo, abaixo, mostra como encontrar todos nomes que terminam com “an”:
SELECT NomeCliente FROM ClientesCidades WHERE NomeCliente REGEXP 'an$'; +------------------+ | NomeCliente | +------------------+ | Aiko Tran | | Karleigh Norman | | Lillith Sloan | | Christen Kaufman | | Camilla Freeman | +------------------+ 5 rows in set (0.00 sec)
Para encontrar os nomes de clientes, na minha tabela, que começam com “Li”…
SELECT NomeCliente FROM ClientesCidades WHERE NomeCliente REGEXP '^li'; +---------------+ | NomeCliente | +---------------+ | Lillith Sloan | +---------------+ 1 row in set (0.00 sec)
Percebeu a insensibilidade do REGEXP à caixa das letras?
Se eu quiser listar as strings que contém a sequência “man”, em qualquer posição:
SELECT NomeCliente FROM ClientesCidades WHERE NomeCliente REGEXP 'man'; +------------------+ | NomeCliente | +------------------+ | Irene Mann | | Karleigh Norman | | Christen Kaufman | | Camilla Freeman | +------------------+ 4 rows in set (0.00 sec)
No exemplo que segue, mostro como encontrar as strings que contém o caractere “i” a partir da 3a. posição na sequência:
SELECT NomeCliente FROM ClientesCidades WHERE NomeCliente REGEXP '^...i'; +------------------+ | NomeCliente | +------------------+ | Christine Mccall | | April Hubbard | | Regina Swanson | | Christen Kaufman | | Madison Love | | Camilla Freeman | | Cecilia Everett | | Kylie Bradshaw | | Zenia Carr | | Jolie Riggs | | Larissa Rich | | Vivian Richmond | | Indira Parker | | Calista Barrett | +------------------+ 14 rows in set (0.00 sec)
A brincadeira com as expressões regulares poderia se estender por dias a fio. O assunto é extenso e será, com certeza, abordado em outros posts — e não somente quando estiver relacionado ao MySQL.
Referências
Como casar padrões no MySQL usando os operadores ‘%’ e ‘_’: https://elias.praciano.com/2015/04/como-encontrar-padroes-entre-os-seus-dados-no-mysql/
MySQL Regular Expressions with The REGEXP Operator: http://www.regular-expressions.info/mysql.html
Oracle documentation: https://dev.mysql.com/doc/refman/5.7/en/regexp.html