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.

Você vai aprender
  • 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 %.

CuringaValePode ser vazio?No formulário
% (porcentagem)Qualquer sequência de caracteresSim: vale também "nada"O campo "Observações"
_ (sublinhado)Exatamente um caractere qualquerNão: tem de haver um caractere aliUma 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_';
TesteResultadoPor quê
'Ana' LIKE 'Ana%'1O % vale "nada": "Ana" seguido de nada é "Ana".
'Ana' LIKE 'Ana_'0O _ exige um caractere depois de "Ana", e não há.
'Anas' LIKE 'Ana_'1Depois de "Ana" há exatamente um caractere: o "s".
'Anabela' LIKE 'Ana_'0Depois 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ãoBuscaExemplo na loja
'Garrafa%'Começa comGarrafa Térmica 1L, Garrafa Squeeze 700ml
'% peças'Termina comJogo de Panelas 5 peças, Faqueiro Inox 24 peças, Quebra-cabeça 500 peças
'%500%'ContémQuebra-cabeça 500 peças, Café Torrado 500g, Azeite Extra Virgem 500ml
'Caneta%Azul'Começa com uma coisa e termina com outraCaneta 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.

Contar sublinhados

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ãoQuer 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):

IdeiaLIKEGLOBExemplo
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çãoQual 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 verdadeESCAPE

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.

O LIKE ignorou a maiúscula que você queria

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

Sublinhados de menos ou de mais
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_'.

Esqueceu o % 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'.

Usou os curingas errados

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.

O _ 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]) *'.

Nos outros bancos
  • 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 sempre ESCAPE, que funciona em todos.
  • SQL Server aceita, dentro do próprio LIKE, listas como as do GLOB: [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ãoCombina comNão combina com
'Ana%'Ana, Ana Beatriz, AnabelaMariana
'%ana'Ana, Mariana, JulianaAnabela
'%ana%'Ana, Mariana, Anabela, JulianaBruno
'Ana_'Anas, AnaíAna, Anabela
'_a%'Maria, Carlos, TaináAna, Bruno
'P_'PI, PEP, PIA
'____-05-__'1990-05-141990-5-14, 1990-06-14
'%!%' ESCAPE '!'Desconto 10%Desconto 100
'%'Qualquer texto, até o vazioNULL

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:

SELECT id, data FROM pedidos WHERE data LIKE '2025-12';

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, use ESCAPE. No GLOB, 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.