Consultar bem não significa trazer toda a tabela e procurar visualmente. Em SQL, a consulta descreve quais colunas e linhas devem compor o resultado; WHERE filtra, ORDER BY ordena a apresentação e LIMIT restringe a quantidade retornada. Para os exemplos, imagine uma tabela produtos com id, nome, categoria, preço, estoque e ativo.
WHERE escolhe quais linhas participam
SELECT nome, preco
FROM produtos
WHERE categoria = 'Higiene';
Textos aparecem entre aspas simples. Números não precisam delas. Operadores comuns incluem =, <>, >, <, >= e <=.
SELECT nome, estoque
FROM produtos
WHERE estoque < 10;
AND, OR e parênteses
AND exige que todas as condições sejam verdadeiras. OR aceita qualquer uma. Quando os dois aparecem, use parênteses para tornar a intenção explícita.
SELECT nome, categoria, preco
FROM produtos
WHERE ativo = true
AND (categoria = 'Higiene' OR categoria = 'Beleza');
WHERE em UPDATE ou DELETE pode alterar todas as linhas. Primeiro execute um SELECT com a mesma condição e confirme o conjunto afetado.LIKE e ILIKE
LIKE procura padrões. O símbolo % representa qualquer sequência de caracteres. No PostgreSQL, ILIKE faz comparação sem diferenciar maiúsculas e minúsculas.
SELECT nome
FROM produtos
WHERE nome ILIKE '%shampoo%';
Esse padrão encontra “shampoo” em qualquer posição do nome. Já 'shampoo%' exige que o texto comece assim.
ORDER BY organiza a apresentação
SELECT nome, preco
FROM produtos
WHERE ativo = true
ORDER BY preco ASC;
ASC ordena de forma crescente e é o padrão. DESC inverte. É possível usar mais de uma coluna para desempatar.
SELECT nome, categoria, preco
FROM produtos
ORDER BY categoria ASC, preco DESC;
A ordenação ocorre depois do filtro lógico. Ela não altera os dados armazenados; muda apenas a apresentação do resultado.
LIMIT controla a quantidade
SELECT nome, estoque
FROM produtos
ORDER BY estoque ASC, id ASC
LIMIT 5;
Essa consulta mostra cinco itens com menor estoque. Usar LIMIT sem ORDER BY não garante quais linhas serão escolhidas. Inclua um critério estável, como o id, para desempatar.
Valores nulos
NULL representa ausência de valor e não é comparado com =. Use IS NULL ou IS NOT NULL.
SELECT nome
FROM produtos
WHERE categoria IS NULL;
Desafio prático
Escreva uma consulta que mostre nome, categoria e preço dos produtos ativos com estoque maior que zero, cujo nome contenha “óleo”, ordenados do maior preço para o menor, exibindo apenas os três primeiros. Depois explique a função de cada cláusula.
Laboratório: transforme uma pergunta em consulta
Em vez de começar escrevendo palavras-chave SQL, formule primeiro a pergunta que o resultado precisa responder. Use uma tabela produtos com as colunas id, nome, categoria, preco e estoque. A pergunta “quais são os três produtos de informática mais baratos que ainda têm estoque?” se divide em quatro decisões verificáveis:
- a origem é a tabela
produtos; - a seleção exige
categoria = 'Informática'eestoque > 0; - o menor preço deve aparecer primeiro;
- o resultado precisa conter somente três linhas.
SELECT id, nome, preco, estoque
FROM produtos
WHERE categoria = 'Informática'
AND estoque > 0
ORDER BY preco ASC, id ASC
LIMIT 3;
O segundo critério de ordenação, id ASC, torna o resultado previsível quando dois produtos têm o mesmo preço. Sem ele, o banco pode devolver empates em ordens diferentes. Troque depois ASC por DESC, retire uma condição e aumente o limite. Antes de executar, anote o que você espera que mude; depois compare com o resultado.
Teste de compreensão
Crie uma consulta para encontrar até cinco produtos com estoque abaixo de 10, ordenados do menor para o maior estoque e, em caso de empate, pelo nome. Confira separadamente o filtro, a ordenação e o limite. Em seguida, avance para SQL JOIN e combine os produtos com outra tabela.
Caso completo: transformar uma pergunta em SQL
Pedido: “Mostre os cinco produtos ativos da categoria Papelaria com estoque abaixo de 10, do menor estoque para o maior; em empate, organize pelo nome”. Antes do código, destaque cada regra: tabela, filtros, ordenação e quantidade.
SELECT id, nome, estoque
FROM produtos
WHERE ativo = true
AND categoria = 'Papelaria'
AND estoque < 10
ORDER BY estoque ASC, nome ASC
LIMIT 5;
O resultado não significa “os cinco primeiros cadastrados”. O WHERE reduz as linhas, o ORDER BY define a prioridade e somente então o LIMIT corta o conjunto. Sem ordenação, não existe garantia útil de quais cinco linhas aparecerão.
Teste condições de fronteira e valores nulos
| Dado | Entra no resultado? | Motivo |
|---|---|---|
| Estoque 9, ativo, Papelaria | Sim | Satisfaz os três filtros |
| Estoque 10 | Não | A condição usa < 10 |
| Estoque NULL | Não | Comparação com NULL não resulta em verdadeiro |
| Estoque 3, inativo | Não | Falha no filtro de ativo |
A documentação do PostgreSQL descreve o WHERE como uma condição booleana aplicada às linhas da tabela derivada. Consulte as expressões de tabela na documentação oficial.
Especificação antes da consulta
Escreva três perguntas de negócio e, para cada uma, marque: colunas exibidas, filtros, direção de ordenação, critério de desempate e limite. Depois crie dados que ficam exatamente dentro e fora de cada condição e confira se a saída corresponde à especificação.
Perguntas frequentes
ORDER BY, LIMIT e LIKE só podem ser usados no SELECT?
ORDER BY e LIMIT são mais comuns no SELECT, mas o suporte em outros comandos varia conforme o banco. LIKE é uma condição e pode aparecer onde expressões de filtro forem aceitas. Consulte a documentação do SGBD.
Posso usar maior e menor com datas?
Sim, desde que a coluna tenha tipo de data ou horário e o valor seja fornecido em formato aceito pelo banco.
Referências bibliográficas
Obras reconhecidas que fundamentam e aprofundam os conceitos apresentados neste artigo.
- BEAULIEU, Alan. Learning SQL . 3. ed. O’Reilly Media, 2020.
- ELMASRI, Ramez; NAVATHE, Shamkant B. Fundamentals of Database Systems . 7. ed. Pearson, 2016.