Esta solução se aplica à busca de padrões em meio ao banco de dados MySQL, com o uso do operador LIKE.
Padrões são strings contendo caracteres especiais.
São conhecidos como meta caracteres porque representam algo diferente de si mesmos.
“Casamento de padrões é o ato de verificação da presença de um padrão em um conjunto de dados (…) usado para testar se o objeto de estudo possui a estrutura desejada (…)” Wikipedia.
O MySQL tem 2 tipos de casamento de padrões. Um, baseado em padrões SQL e outro baseado em expressões regulares.
Cada um destes usa seus próprios operadores e diferentes sets de meta caracteres.
Neste texto, vou me limitar aos padrões SQL.
Exemplos de uso do operador LIKE no MySQL
O casamento de padrões SQL usa os operadores LIKE e NOT LIKE – em vez de = ou != – para encontrar paridade entre padrões.
Os padrões podem conter dois meta caracteres especiais (ou coringas):
%
— o sinal de percentual serve para buscar a correspondência exata de caracteres — sem se preocupar com o posicionamento deles dentro da string._
— o sinal de sublinha ou underscore procura a correspondência, só que dentro do mesmo posicionamento de caracteres.
São caracteres-curinga, portanto. Semelhantes aos que você usa em um terminal para se referir a vários nomes de arquivos que sejam parcialmente iguais. Ex.: mysql.*
, config*.ini
etc.
A palavra curinga se origina do termo “kuringa”, em kimbundo. E significa “matar”.
via Wikipedia.
Complicado? Então, vamos deixar os exemplos falarem por si.
Veja como fazer uma busca, dentro da tabela ClientesCidades, por todos os nomes de cidades que contenham a sequência de caracteres “co”, no início:
SELECT CidadeCliente FROM ClientesCidades WHERE CidadeCliente LIKE 'co%';
+-----------------+ | CidadeCliente | +-----------------+ | Corroy-le-Grand | | Coalhurst | | Colonnella | +-----------------+ 3 rows in set (0.04 sec)
Você não precisa usar as minhas tabelas para aplicar os exemplos no seu aprendizado. Pode usar qualquer outra, que você tiver disponível. Basta readequar os exemplos deste texto à sua realidade.
Só não vá brincar com os dados da produção.
Se quiser encontrar os nomes de cidade que terminem com a sequência “co”, inverta a posição do sinal de percentual (%):
SELECT CidadeCliente FROM ClientesCidades WHERE CidadeCliente LIKE '%co';
+---------------+ | CidadeCliente | +---------------+ | Girifalco | | Recco | +---------------+
Ou, encontre todos nomes de cidade que contenham a sequência “co”, em qualquer posição na string:
SELECT CidadeCliente FROM ClientesCidades WHERE CidadeCliente LIKE '%co%';
+------------------------+ | CidadeCliente | +------------------------+ | Girifalco | | San Costantino Calabro | | Rocourt | | Beaconsfield | | Rachecourt | | Vancouver | | Lacombe | | Port Lincoln | | Corroy-le-Grand | | Recco | | Coalhurst | | San Demetrio Corone | | Lakeland County | | Beaconsfield | | Colonnella | +------------------------+ 15 rows in set (0.01 sec)
Note que, neste caso, o operador sequer exige que haja a correspondência da caixa das letras — ou seja, “Colonnella” e “u>colonnella” são a mesma coisa.
Ao criar um sistema de buscas, usar coringas é uma opção para encontrar e exibir uma série de resultados relacionados.
O caractere-curinga underscore (_) é mais restritivo. Ele só serve para substituir os caracteres que se encontram na posição em que ele for colocado na busca.
Uso de curinga | Correspondências possívels |
---|---|
__enda | Brenda, Glenda |
___nda | Brenda, Glenda, Amanda, Chanda. |
C_ntia | Cíntia, Cintia, Cyntia | C_n%ia | Cíntia, Cintia, Cyntia, Cynthia, Cínthia etc. |
Espero que a tabela ajuda a entender melhor o funcionamento do underscore no SQL.
Veja alguns exemplos de uso do LIKE, combinado a este caractere-curinga:
SELECT Nome FROM Clientela WHERE Nome LIKE 'Al__a'; +----------+ | Nome | +----------+ | Alisa | | Alana | | Alexa | | Alana | +----------+ 4 rows in set (0.00 sec)
Combine o uso dos caracteres-curinga ‘%’ e ‘_’ para enriquecer seus resultados — o que pode ser necessário, se a coluna incluir nome e sobrenome:
SELECT NomeCliente FROM ClientesCidades WHERE NomeCliente LIKE 'I__ana%' ORDER BY NomeCliente; +------------------+ | NomeCliente | +------------------+ | Iliana Cleveland | | Illana Cannon | +------------------+ 2 rows in set (0.00 sec)
Como usar o NOT LIKE em uma query MySQL
Se eu quiser uma relação de todos os nomes que não contenham uma determinada letra ou sequência de caracteres, posso usar o NOT LIKE para fazer o trabalho. Veja um exemplo, que exclui todos os nomes (e sobrenomes) que contenham a letra ‘a’:
SELECT NomeCliente FROM ClientesCidades WHERE NomeCliente NOT LIKE '%a%' ORDER BY NomeCliente; +--------------------+ | NomeCliente | +--------------------+ | Bo Simpson | | Emily Holmes | | Emily Tyson | | Giselle Rice | | Helen Burke | | Melodie Levy | | Mercedes Hendricks | | Michelle Whitley | | Simone Everett | | Yvonne Wilcox | +--------------------+ 10 rows in set (0.00 sec)
Como combinar as buscas com LIKE e outras funções de manipulação de strings no MySQL
Use funções específicas para retirar o que te interessa nas strings:
SELECT NomeCliente FROM ClientesCidades WHERE LEFT(Nomecliente,3) LIKE 'wil%' ORDER BY NomeCliente; +-----------------+ | NomeCliente | +-----------------+ | Willa Kerr | | Willow Graham | | Willow Mitchell | | Willow Simmons | | Wilma Hill | +-----------------+ 5 rows in set (0.00 sec)
Leia mais sobre funções para decompor strings ou use o quadro de busca desta página para se aprofundar mais no assunto.
Referências: Casamentos de padrão na Wikipedia: http://pt.wikipedia.org/wiki/Casamento_de_padr%C3%B5es.
Como pesquisar sequências de caracteres dentro de strings, com a função LOCATE, no MySQL.