Informática

SQL: SELECT, WHERE, ORDER BY, LIKE e IN com exemplos

Quase toda questão de SQL em concurso pede que você leia uma consulta e diga o que ela devolve. Dominar SELECT, WHERE e ORDER BY resolve a maior parte delas. Este guia usa uma tabela pequena e fictícia, e todas as consultas abaixo foram executadas em um banco de teste para conferir os resultados.

A tabela de exemplo

Imagine uma tabela servidor com sete linhas. A coluna horas_extras aceita valores ausentes (NULL), o que será importante adiante.

id nome unidade_id cargo horas_extras tempo_servico
1 Ana Lima 1 Analista 10 5
2 Bruno Souza 1 Tecnico 4 12
3 Carla Dias 2 Analista NULL 3
4 Diego Alves 2 Analista 8 9
5 Elisa Rocha 3 Tecnico 0 7
6 Fabio Nunes NULL Analista 6 2
7 Gabi Matos 2 Tecnico NULL 15

Os dados são inventados para o exemplo; não representam servidores reais.

A ordem de leitura de uma consulta

Escreve-se SELECT ... FROM ... WHERE ... ORDER BY ..., mas o raciocínio lógico segue outra ordem: primeiro FROM (qual tabela), depois WHERE (quais linhas), depois SELECT (quais colunas) e por fim ORDER BY (em que ordem). Ler nessa sequência evita erro de interpretação.

  • Projeção é escolher colunas (SELECT nome, cargo). SELECT * traz todas.
  • Seleção é escolher linhas (WHERE). Não confunda: no jargão da álgebra relacional, os nomes são os mesmos, mas a ideia é outra, e a prova costuma explorar essa troca.

SELECT com WHERE

SELECT nome, cargo FROM servidor WHERE cargo = 'Analista' ORDER BY nome;

Resultado: Ana Lima, Carla Dias, Diego Alves e Fabio Nunes, nessa ordem alfabética. Textos vão entre aspas simples; números, sem aspas.

Operadores de comparação e lógicos

Use =, <> (diferente), <, >, <= e >=. Combine condições com AND, OR e NOT. O AND é avaliado antes do OR; use parênteses para deixar a intenção clara.

SELECT nome FROM servidor
WHERE cargo = 'Analista' AND (horas_extras > 5 OR tempo_servico > 8)
ORDER BY id;

Devolve Ana Lima, Diego Alves e Fabio Nunes. Carla Dias fica de fora: a condição horas_extras > 5 não é verdadeira para NULL, e o tempo de serviço dela (3) não passa de 8. Sem os parênteses, a consulta seria lida como (cargo = 'Analista' AND horas_extras > 5) OR tempo_servico > 8 e traria também Bruno Souza e Gabi Matos, que não são analistas.

BETWEEN, IN e LIKE

BETWEEN é inclusivo nos dois extremos:

SELECT nome, tempo_servico FROM servidor
WHERE tempo_servico BETWEEN 5 AND 12
ORDER BY tempo_servico DESC;

Resultado: Bruno Souza (12), Diego Alves (9), Elisa Rocha (7) e Ana Lima (5). Os valores 5 e 12 entraram.

IN compara com uma lista; equivale a vários OR com =:

SELECT nome FROM servidor WHERE unidade_id IN (1, 3) ORDER BY id;

Devolve Ana Lima, Bruno Souza e Elisa Rocha. Fabio Nunes, com unidade NULL, não aparece.

LIKE busca padrões em texto, com dois curingas: % representa zero ou mais caracteres e _ representa exatamente um.

Padrão Casa com
'A%' começa com A
'%ou%' contém “ou” em qualquer posição
'_ana%' um caractere qualquer e depois “ana”

Na tabela, nome LIKE 'A%' devolve só Ana Lima, e nome LIKE '%ou%' devolve só Bruno Souza. Atenção: a sensibilidade a maiúsculas e minúsculas no LIKE depende do sistema gerenciador. No SQLite usado no teste, o LIKE ignora a caixa para letras do alfabeto básico; em outros sistemas, pode diferenciar. Se a questão não diz, a resposta correta costuma tratar o padrão literalmente.

ORDER BY, DISTINCT e LIMIT

ORDER BY ordena de forma crescente por padrão (ASC); DESC inverte. Pode haver mais de um critério:

SELECT nome, horas_extras FROM servidor ORDER BY horas_extras DESC, nome;

A sequência obtida foi: Ana Lima (10), Diego Alves (8), Fabio Nunes (6), Bruno Souza (4), Elisa Rocha (0), Carla Dias (NULL), Gabi Matos (NULL). Aqui os NULL apareceram por último na ordem decrescente, mas a posição dos nulos varia entre sistemas: alguns os colocam primeiro. Na prova, se a posição do NULL importar, o enunciado precisa dizer o sistema.

DISTINCT elimina linhas repetidas do resultado:

SELECT DISTINCT cargo FROM servidor;

Devolve apenas dois valores, Analista e Tecnico, embora a tabela tenha sete linhas.

LIMIT n restringe a quantidade de linhas (em alguns sistemas a palavra muda, como TOP ou FETCH FIRST). Combinado com ORDER BY, responde a “os três com mais tempo de serviço”:

SELECT nome FROM servidor ORDER BY tempo_servico DESC LIMIT 3;

Resultado: Gabi Matos, Bruno Souza e Diego Alves. Sem ORDER BY, o LIMIT devolve linhas em ordem não garantida.

Erros comuns

  • Escrever WHERE cargo = Analista sem aspas: o sistema entende como nome de coluna.
  • Achar que BETWEEN 5 AND 12 exclui os extremos.
  • Usar aspas duplas para texto: no padrão SQL, aspas duplas indicam identificador, não valor.
  • Esquecer os parênteses ao misturar AND e OR.
  • Supor que a ordem das linhas é a de inserção quando não há ORDER BY.
  • Esperar que comparações com NULL funcionem como as demais; esse ponto tem guia próprio: NULL no SQL e a lógica de três valores.

Fontes e atualização

Não há norma oficial brasileira para a linguagem SQL; o conteúdo segue o padrão da linguagem e a prática dos sistemas gerenciadores, e os resultados acima vieram da execução das consultas em um banco de teste. Cada sistema tem variações (LIKE, LIMIT, posição de NULL). Confira no edital qual sistema ou padrão a banca adota.

Próximos passos

Leia também

Para continuar no site

Viu algo errado, desatualizado ou confuso? Relatar erro nesta página