Combinar WHERE, ORDER BY e LIMIT em SQL
Lição 2.8 · Tempo de leitura: ~6 min · Tarefas para praticar ↓
A maioria das consultas SQL reais combina WHERE, ORDER BY e LIMIT: elas filtram as linhas, ordenam-nas e devolvem apenas a parte necessária. Nesta lição, você vai aprender a ordem obrigatória dessas cláusulas, a ordem em que o banco de dados realmente as processa, e como escrever consultas top-N filtradas e com paginação.
Neste módulo, você aprendeu a filtrar linhas com WHERE, ordená-las com ORDER BY e limitar o resultado com LIMIT. Separadamente, cada cláusula resolve uma pequena tarefa. Juntas, respondem a perguntas típicas de negócio: "os 5 filmes mais baratos de repor", "os últimos pagamentos acima de $10", "a página 2 dos resultados da pesquisa".
A Ordem de Escrita das Cláusulas
As cláusulas de uma consulta SELECT devem ser escritas numa ordem fixa. Em qualquer outra ordem, o banco de dados devolve um erro de sintaxe.
SELECT columns
FROM table_name
WHERE condition
ORDER BY sort_columns
LIMIT row_count OFFSET skip_count;
SELECT: quais colunas devolver.FROM: qual tabela ler.WHERE: quais linhas manter.ORDER BY: como ordená-las.LIMIT/OFFSET: qual parte do resultado ordenado devolver.
Esta é a ordem das cláusulas que você já conhece; GROUP BY e HAVING ficarão entre WHERE e ORDER BY no Módulo 4.
A Ordem Lógica de Processamento
O banco de dados não processa uma consulta na ordem em que ela é escrita. Logicamente, os passos são:
| Passo | Cláusula | O que acontece |
|---|---|---|
| 1 | FROM | A tabela de origem é escolhida |
| 2 | WHERE | As linhas que não satisfazem a condição são removidas |
| 3 | SELECT | As colunas e expressões do resultado são calculadas |
| 4 | ORDER BY | As linhas são ordenadas |
| 5 | LIMIT / OFFSET | A parte pedida das linhas ordenadas é devolvida |
Essa ordem explica duas regras importantes:
- O
WHEREnão pode usar alias de colunas doSELECT: no passo 2 eles ainda não existem. - O
LIMITé aplicado depois da filtragem e da ordenação, então "top 5" significa as 5 primeiras linhas filtradas, e não 5 linhas aleatórias que depois são filtradas.
O otimizador pode executar a consulta de outra forma internamente, mas o resultado é sempre o mesmo que se os passos fossem executados nessa ordem.
Consultas Top-N com Filtro
Os Cinco Filmes Baratos Mais Curtos
SELECT title, length, replacement_cost
FROM film
WHERE replacement_cost < 15.00
ORDER BY length, title
LIMIT 5;
Resultado: os 5 filmes mais curtos cuja reposição custa menos de $15.
Os Últimos Pagamentos Grandes
SELECT payment_id, customer_id, amount, payment_date
FROM payment
WHERE amount >= 10.00
ORDER BY payment_date DESC
LIMIT 10;
Resultado: os 10 pagamentos mais recentes de $10 ou mais.
Atores por Letra
SELECT first_name, last_name
FROM actor
WHERE last_name LIKE 'B%'
ORDER BY first_name, last_name
LIMIT 3;
Resultado: os 3 primeiros atores, pela ordem do nome, cujo sobrenome começa com "B".
Paginação de uma Lista Filtrada
As aplicações costumam paginar uma lista filtrada e ordenada, como resultados de pesquisa. As três cláusulas são necessárias:
WHEREseleciona as linhas que o usuário procura.ORDER BYfixa a ordem, para que as linhas não se repitam nem desapareçam entre páginas.LIMITeOFFSETescolhem a página:LIMIT S OFFSET (N - 1) * S.
SELECT first_name, last_name
FROM actor
WHERE first_name LIKE 'A%'
ORDER BY last_name, first_name
LIMIT 5 OFFSET 5;
Resultado: a página 2 (linhas 6 a 10) dos atores cujo nome começa com "A", ordenados pelo sobrenome.
Principais conclusões:
- A ordem de escrita é
SELECT→FROM→WHERE→ORDER BY→LIMIT. - A ordem lógica é
FROM→WHERE→SELECT→ORDER BY→LIMIT. - O
WHEREé aplicado antes doSELECT, por isso não pode usar alias de colunas; oORDER BYpode. - O
LIMITpega linhas de um resultado já filtrado e ordenado. - Para listas top-N e paginação estáveis, torne a ordenação única.
Perguntas Frequentes
Qual é a ordem correta de WHERE, ORDER BY e LIMIT em SQL?
Primeiro WHERE, depois ORDER BY e depois LIMIT: SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT .... Qualquer outra ordem causa um erro de sintaxe.
Em que ordem o SQL executa uma consulta?
Logicamente: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT. É por isso que o WHERE não pode usar alias do SELECT, enquanto o ORDER BY pode.
O LIMIT é aplicado antes ou depois do WHERE?
Depois. O banco de dados primeiro filtra as linhas com WHERE, ordena-as com ORDER BY e só então devolve o número de linhas definido por LIMIT.