SQL Curingas (% e _)
No baralho, o curinga vale qualquer carta. No LIKE (aula LIKE), os curingas valem qualquer letra. São só dois, e com eles você monta quase toda busca de texto: o %, que vale "qualquer quantidade de caracteres", e o _, que vale "exatamente um caractere". Nesta aula você vai combiná-los para achar pedidos de um mês, clientes nascidos em maio, telefones no formato brasileiro e nomes de um tamanho certo.
- O
%: zero, um ou muitos caracteres. - O
_: exatamente um caractere, nem mais nem menos. - Combinar os dois para buscar pelo começo, pelo fim, pelo meio, pela posição e pelo tamanho.
- Buscas em datas guardadas como texto (
2026-10-%) e em telefones ((__) _____-____). - O que fazer quando o texto tem um
%ou um_de verdade. - Os curingas equivalentes do
GLOB(*e?) e as armadilhas mais comuns.
Os exemplos usam o banco da Loja Aurora, e cada quadro "Resultado" vem do SQLite de verdade, rodando no seu navegador.
A ideia: as caixinhas do formulário
Pense num formulário de papel com caixinhas para o CEP: [_][_][_][_][_]-[_][_][_]. Cada caixinha recebe um algarismo, e você sabe exatamente quantos cabem. Esse é o _. Agora pense no campo "Observações", uma linha comprida em que cabe qualquer coisa, de nada a um parágrafo. Esse é o %.
| Curinga | Vale | Pode ser vazio? | No formulário |
|---|---|---|---|
% (porcentagem) | Qualquer sequência de caracteres | Sim: vale também "nada" | O campo "Observações" |
_ (sublinhado) | Exatamente um caractere qualquer | Não: tem de haver um caractere ali | Uma caixinha do CEP |
1. O % vale até "nada"
A melhor forma de ver um curinga é testá-lo em textos soltos. Cada coluna abaixo pergunta "este texto combina com este padrão?" (1 = sim, 0 = não):
SELECT 'Ana' LIKE 'Ana%', 'Ana' LIKE 'Ana_', 'Anas' LIKE 'Ana_', 'Anabela' LIKE 'Ana_';
| Teste | Resultado | Por quê |
|---|---|---|
'Ana' LIKE 'Ana%' | 1 | O % vale "nada": "Ana" seguido de nada é "Ana". |
'Ana' LIKE 'Ana_' | 0 | O _ exige um caractere depois de "Ana", e não há. |
'Anas' LIKE 'Ana_' | 1 | Depois de "Ana" há exatamente um caractere: o "s". |
'Anabela' LIKE 'Ana_' | 0 | Depois de "Ana" há quatro caracteres; o _ só vale um. |
Com o %, a posição dele no padrão decide a busca. Uma revisão rápida da aula anterior, com um exemplo de cada:
| Padrão | Busca | Exemplo na loja |
|---|---|---|
'Garrafa%' | Começa com | Garrafa Térmica 1L, Garrafa Squeeze 700ml |
'% peças' | Termina com | Jogo de Panelas 5 peças, Faqueiro Inox 24 peças, Quebra-cabeça 500 peças |
'%500%' | Contém | Quebra-cabeça 500 peças, Café Torrado 500g, Azeite Extra Virgem 500ml |
'Caneta%Azul' | Começa com uma coisa e termina com outra | Caneta Esferográfica Azul |
'%' | Qualquer texto (mas não NULL) | Todos os 45 produtos |
Vários % no mesmo padrão
Um padrão pode ter quantos % você quiser. Os produtos que têm "de" duas vezes no nome:
SELECT nome FROM produtos WHERE nome LIKE '%de%de%';
Repare no "Conjunto de Copos 6 unidades": o segundo "de" está dentro de "unidades". O LIKE não sabe o que é uma palavra; ele só procura as letras. E no "Guia de Receitas do Nordeste", também. Se você quer a palavra "de" sozinha, inclua os espaços: '% de % de %'.
Dá para contar palavras do mesmo jeito. Os clientes com pelo menos três palavras no nome (dois espaços):
SELECT nome FROM clientes WHERE nome LIKE '% % %';
2. O _: um caractere, numa posição certa
O _ serve quando você sabe onde está a letra, ou quantas letras há. Os estados com duas letras que começam com P:
SELECT nome, estado FROM clientes WHERE estado LIKE 'P_';
Piauí (PI) e Pernambuco (PE): 16 clientes. O 'P_' quer dizer "um P e mais um caractere". Como toda sigla de estado tem duas letras, aqui 'P%' daria o mesmo resultado; o _ só deixa a intenção mais clara.
Pela posição
Os clientes cujo nome tem "a" como segunda letra:
SELECT nome FROM clientes WHERE nome LIKE '_a%';
- _
- A primeira letra, qualquer uma (o M de Maria, o C de Carlos…).
- a
- A segunda letra tem de ser "a".
- %
- O resto do nome, qualquer coisa.
Pelo tamanho
E os clientes cujo primeiro nome tem exatamente 5 letras? Cinco _, um espaço e o resto:
SELECT nome FROM clientes WHERE nome LIKE '_____ %';
Maria, Tiago, Bruno, Paulo, Tainá e Elias. Repare na Tainá: o "á" conta como um caractere, como deve ser. O espaço depois dos cinco _ é o que garante o tamanho: sem ele, '_____%' aceitaria qualquer nome com cinco letras ou mais.
Vários _ seguidos ficam difíceis de contar na tela (_____ são cinco?). Conte com o dedo, ou escreva o padrão em partes num comentário (aula Comentários): -- 5 letras + espaço + resto.
Experimente: as datas de nascimento estão no formato AAAA-MM-DD (como 1990-05-14). Mostre os clientes nascidos em maio, de qualquer ano: quatro _ para o ano, -05- e dois _ para o dia. São 3.
SELECT nome, nascimento FROM clientes WHERE nascimento LIKE '05%';
SELECT nome, nascimento FROM clientes WHERE nascimento LIKE '____-05-__';
3. Curingas em datas e telefones
Datas guardadas como texto
A Loja Aurora guarda as datas como texto no formato AAAA-MM-DD. Com o %, fica fácil pegar um mês inteiro. Os pedidos de outubro de 2026:
SELECT id, data FROM pedidos WHERE data LIKE '2026-10-%';
Três pedidos: 88, 89 e 90. E os clientes que fazem aniversário em dezembro (qualquer ano, qualquer dia):
SELECT nome, nascimento FROM clientes WHERE nascimento LIKE '%-12-%';
Isso funciona porque as datas estão sempre com dois algarismos no mês e no dia (05, e não 5). Para contas de verdade com datas (dias entre duas datas, o mês atual…), o SQL tem funções próprias, na aula Funções de Data.
O formato de um telefone
Os telefones dos fornecedores misturam o formato brasileiro, como (86) 99821-4455, com o internacional, como +351 22 123 4567. Para achar os que estão no formato brasileiro de celular, desenhe o formato com _:
SELECT nome, telefone FROM fornecedores WHERE telefone LIKE '(__) _____-____';
Os 4 fornecedores brasileiros. Os de Portugal e da Argentina não têm parênteses nem a mesma quantidade de algarismos, e ficaram de fora. Um detalhe: o _ aceita qualquer caractere, não só algarismos. (ab) cdefg-hijk também passaria. Para exigir algarismos, só com o GLOB e o [0-9] (seção 5).
4. Quando o % ou o _ é de verdade
Como você viu em LIKE, dentro do padrão o % e o _ são sempre curingas. Para procurar um sublinhado ou um sinal de porcentagem de verdade, escolha um caractere de escape com ESCAPE e ponha-o antes:
SELECT 'Desconto 10%' LIKE '%10!%' ESCAPE '!',
'Desconto 100' LIKE '%10!%' ESCAPE '!',
'Desconto 100' LIKE '%10%';
| Padrão | Quer dizer |
|---|---|
'%10!%' ESCAPE '!' | Termina com "10%" (o último % é um sinal de porcentagem) |
'%10%' | Contém "10" (o último % é curinga): por isso "Desconto 100" passa |
'%!_%' ESCAPE '!' | Contém um sublinhado de verdade |
'%!!%' ESCAPE '!' | Contém um ponto de exclamação (o próprio caractere de escape, dobrado) |
5. Formas diferentes: os curingas do GLOB
O GLOB, que só existe no SQLite, faz o mesmo papel com outros símbolos, e diferencia maiúsculas de minúsculas (veja LIKE):
| Ideia | LIKE | GLOB | Exemplo |
|---|---|---|---|
| Qualquer sequência (até nada) | % | * | cidade LIKE 'P%' = cidade GLOB 'P*' (Parnaíba, Picos) |
| Exatamente um caractere | _ | ? | nome LIKE '_a%' = nome GLOB '?a*' (Maria, Carlos…) |
| Um caractere de uma lista | — | [abc] | GLOB '[AEIOU]*': começa com vogal maiúscula |
| Um caractere de uma faixa | — | [0-9] | GLOB '*[0-9]': termina com algarismo |
| Um caractere fora da lista | — | [^abc] | GLOB '[^A]*': não começa com A |
SELECT nome FROM clientes WHERE nome GLOB '?a*';
Os mesmos 9 clientes do '_a%' da seção 2. Para quase tudo, o LIKE basta e funciona em qualquer banco. Use o GLOB quando precisar de listas ([0-9]) ou quando maiúsculas importarem.
| Situação | Qual usar |
|---|---|
| Começo, fim ou meio do texto | % |
| Uma letra numa posição certa, ou um tamanho certo | _ (um por caractere) |
Um mês numa data AAAA-MM-DD | '2026-10-%' ou '____-10-__' |
| Só algarismos, só vogais… | GLOB com [0-9], [aeiou] |
O texto tem % ou _ de verdade | ESCAPE |
Quando dá errado
Curingas quase nunca dão mensagem de erro: o SQL roda, e o problema aparece como linhas a mais ou a menos. Por isso, confira sempre se o número de linhas faz sentido.
A Ana quer os produtos medidos em mililitros (ml) ou em litros (L):
SELECT nome FROM produtos WHERE nome LIKE '%ml' OR nome LIKE '%L';
O que aconteceu: vieram 7 produtos, entre eles a Caneta Esferográfica Azul, a Mochila Escolar Azul e a Caixa de Som Portátil. O LIKE ignora maiúsculas, então '%L' é igual a '%l': "termina com a letra L, maiúscula ou minúscula".
Como consertar: seja mais específico, exigindo um algarismo antes do L: GLOB '*[0-9]L', que diferencia maiúsculas e só aceita algarismos (Garrafa Térmica 1L, Regador Plástico 5L).
SELECT nome, estado FROM clientes WHERE estado LIKE 'P__';
O que aconteceu: 0 linhas, sem erro. 'P__' exige três caracteres (P + 2), e as siglas têm dois. Um _ a mais, e nada passa; um a menos, e também nada.
Como consertar: um _ para cada caractere que falta: 'P_'.
% no meio
SELECT nome FROM produtos WHERE nome LIKE 'Caneta Azul';
O que aconteceu: 0 linhas. O produto se chama "Caneta Esferográfica Azul", e o padrão, sem curinga, só aceita o texto exato "Caneta Azul".
Como consertar: ponha um % onde pode haver "qualquer coisa": 'Caneta%Azul'.
LIKE 'Ana*' e LIKE '?a%' não dão erro, mas também não acham nada do que você queria: o * e o ? são curingas do GLOB (e da busca de arquivos do computador). No LIKE, eles são caracteres comuns. E o contrário também vale: GLOB 'Ana%' procura um sinal de porcentagem de verdade.
_ pegou mais do que você queria
O _ vale qualquer caractere, inclusive espaço, ponto, hífen ou letra. O padrão de telefone '(__) _____-____' aceitaria "(xx) abcde-fghi". Se precisar exigir algarismos, use GLOB '([0-9][0-9]) *'.
- O
%e o_são padrão SQL e funcionam igual no MySQL, no PostgreSQL e no SQL Server. - Escape automático: no MySQL e no PostgreSQL, a barra invertida já é o escape quando você não escreve
ESCAPE:LIKE '%\_%'procura um sublinhado de verdade. No SQLite (e no padrão SQL), não há escape automático; escreva sempreESCAPE, que funciona em todos. - SQL Server aceita, dentro do próprio
LIKE, listas como as doGLOB:[0-9],[^a], e usa colchetes também para escapar um curinga:LIKE '5[%]'procura "5%".
Ilustrativo (não roda no SQLite):
-- MySQL / PostgreSQL: a barra invertida escapa o curinga SELECT nome FROM produtos WHERE nome LIKE '%\_%'; -- SQL Server: listas e escape com colchetes SELECT nome FROM fornecedores WHERE telefone LIKE '([0-9][0-9]) %'; SELECT nome FROM produtos WHERE nome LIKE '%10[%]%';
Referência rápida
| Padrão | Combina com | Não combina com |
|---|---|---|
'Ana%' | Ana, Ana Beatriz, Anabela | Mariana |
'%ana' | Ana, Mariana, Juliana | Anabela |
'%ana%' | Ana, Mariana, Anabela, Juliana | Bruno |
'Ana_' | Anas, Anaí | Ana, Anabela |
'_a%' | Maria, Carlos, Tainá | Ana, Bruno |
'P_' | PI, PE | P, PIA |
'____-05-__' | 1990-05-14 | 1990-5-14, 1990-06-14 |
'%!%' ESCAPE '!' | Desconto 10% | Desconto 100 |
'%' | Qualquer texto, até o vazio | NULL |
Exercícios
1. Exatamente um
Qual curinga vale exatamente um caractere?
2. O mês na data
Complete o padrão para achar os pedidos de dezembro de 2025:
3. 'Ana' LIKE 'Ana%' dá qual resultado?
4. Qual destes nomes combina com '_a%'?
5. Por que nome LIKE '%L' acha a "Mochila Escolar Azul"?
6. No GLOB, qual é o equivalente do _?
Missão final: nomes de cinco letras
Missão: a Ana quer os clientes cujo primeiro nome tem exatamente 5 letras (são 6). O padrão abaixo traz gente demais: ele aceita qualquer nome com 5 letras ou mais. Conserte o padrão.
SELECT nome FROM clientes WHERE nome LIKE '_____%';
SELECT nome FROM clientes WHERE nome LIKE '_____ %';
Dica, se travar: depois do primeiro nome vem sempre um espaço.
Resumo
%vale qualquer sequência de caracteres, até nenhuma;_vale exatamente um caractere.- Combine-os:
'Garrafa%'(começo),'% peças'(fim),'%500%'(meio),'_a%'(posição),'_____ %'(tamanho). - Em datas
AAAA-MM-DD,'2026-10-%'pega um mês;'____-05-__'pega maio de qualquer ano. - O
_conta caracteres (o "á" é um só) e aceita qualquer caractere, não só letras ou algarismos. - Para um
%ou_de verdade, useESCAPE. NoGLOB, os curingas são*e?, e há listas como[0-9]. - Curingas quase nunca dão erro: o engano aparece como linhas a mais ou a menos. Confira se o número de linhas faz sentido.