O MySQL fornece combinação de padrões do SQL bem como na
forma de combinação de padrões baseado nas expressões
regulares extendidas similares àquelas usadas pelos
utilitários Unix como o vi
,
grep
e sed
.
A combinação de padrões SQL lhe permite você usar
_
para coincidir qualquer caractere simples
e %
para coincidir um número arbitrário
de caracteres (incluindo zero caracter). No MySQL, padrões
SQL são caso insensitivo por padrão. Alguns exemplos são
vistos abaixo. Perceba que você não usa =
ou !=
quando usar padrões SQL; use os
operadores de comparação LIKE
ou
NOT LIKE
neste caso.
Para encontrar nomes começando com
‘b
’:
mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Para encontrar nomes com o final 'fy
':
mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Para encontrar nomes contendo um
‘w
’:
mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
Para encontrar nomes contendo exatamente cinco caracteres, use
cinco instâncias do caracter
‘_
’:
mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
O outro tipo de combinação de padrões fornecido pelo MySQL
usa expressões regulares extendidas. Quando você testa por
uma combinação para este tipo de padrão, utilize os
operadores REGEXP
e NOT
REGEXP
(ou RLIKE
e NOT
RLIKE
, que são sinônimos).
Algumas características das expressões regulares extendidas são:
‘.
’ combina qualquer
caractere único
Uma classe de caracteres '[...]
'
combina qualquer caractere que consta dentro dos
colchetes. Por exemplo, '[abc]
' combina
com ‘a
’,
‘b
’, ou
‘c
’. Para nomear uma
sequência de caracteres utilize um traço.
'[a-z]
' combina com qualquer letra e
'[0-9]
' combina com qualquer dígito.
‘*
’ combina com nenhuma ou
mais instâncias de sua precedência. Por exemplo,
'x*
' combina com qualquer número de
caracteres ‘x
’,
'[0-9]*
' combina com qualquer número
de dígitos e '.*
' combina com qualquer
número de qualquer coisa.
Um padrão REGEXP
casa com sucesso se
ele ocorre em algum lugar no valor sendo testado. (Ele
difere do padrão LIKE
, que só obtem
suceeso se eles combinarem com todo o valor.)
Para fazer com que um padrão deva combinar com o começo
ou o fim de um valor sendo testado, utilize
‘^
’ no começo ou
‘$
’ no final do padrão.
Para demonstrar como expressões regulares extendidas
funcionam, as consultas com LIKE
mostradas
acima foram reescritas abaixo usando
REGEXP
.
Para encontrar nomes começando com
‘b
’, utilize
‘^
’ para combinar com o começo
do nome:
mysql> SELECT * FROM pet WHERE name REGEXP "^b";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Antes da versão 3.23.4 do MySQL, REGEXP
era caso sensitivo, e a consulta anterior não iria retornar
nenhum registro. Neste caso, para combinar letras
‘b
’ maiúsculas e minúsculas,
utilize esta consulta:
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
A partir do MySQL 3.23.4, se você realmente deseja forçar
uma comparação REGEXP
com caso sensitivo,
utilize a palavra-chave BINARY
para tornar
uma das strings em uma string binárias. Esta consulta irá
combinar somente com ‘b
’s
minúsculos no começo de um nome:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";
Para encontrar nomes finalizados com 'fy
',
utilize ‘$
’ para combinar com o
final do nome:
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Para encontrar nomes contendo um
‘w
’, utilize esta consulta:
mysql> SELECT * FROM pet WHERE name REGEXP "w";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
Como uma expressão regular extendida encontra padrões coincidentes se eles ocorrem em qualquer lugar no valor comparado, não é necessário utiliar, na consulta anterior, nenhum metacaracter em nenhum dos lados do padrão para fazê-lo coincidir com todo o valor, como seria feito se fosse utilizado o padrão SQL.
Para encontrar nomes contendo exatamente cinco caracteres,
utilize ‘^
’ e
‘$
’ para combinar com o começo
e fim do nome e cinco instâncias de
‘.
’ entre eles.
mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Você pode também escrever a consulta anterior utilizando o
operador '{n}
'
``repete-n
-vezes'':
mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.