Lição 2.7: Juntando Tudo: WHERE, ORDER BY e LIMIT
Até agora, aprendemos como filtrar linhas (WHERE), ordená-las (ORDER BY) e restringir o número de resultados (LIMIT). Em cenários do mundo real, você quase sempre usará essas cláusulas juntas para obter exatamente os dados de que precisa.
A Ordem das Cláusulas
O SQL possui uma ordem estrita para como essas cláusulas devem aparecer no texto da consulta. Se você as colocar na ordem errada, o banco de dados retornará um erro.
A sequência abaixo está correta apenas para as cláusulas que já estudamos até aqui neste módulo. A ordem completa das partes de uma consulta SQL é mais ampla e será expandida à medida que você aprender novas construções da linguagem.
A sequência correta no texto da consulta é:
SELECT(Quais colunas?)FROM(Qual tabela?)WHERE(Filtre as linhas primeiro)ORDER BY(Ordene as linhas filtradas)LIMIT(Pegue os primeiros X resultados da lista ordenada)OFFSET(Pule X linhas, se necessário)
Importante: essa ordem descreve como você escreve a consulta, e não sua ordem lógica de processamento. Logicamente, o SQL trata as partes da consulta de outra forma.
Ordem Lógica de Processamento
Quando você executa uma consulta combinada, o banco de dados a processa conceitualmente assim:
- Primeiro, ele determina a fonte de dados a partir de
FROM. - Em seguida, aplica as condições de filtragem de
WHERE. - Depois disso, forma a lista de colunas selecionadas a partir de
SELECT. - Então, ordena o resultado conforme
ORDER BY. - Por fim, aplica
OFFSETpara pular linhas, se necessário, e depoisLIMITpara retornar a parte necessária das linhas ordenadas.
É por isso que WHERE não pode se referir a aliases definidos em SELECT: na etapa de filtragem, a lista de colunas selecionadas ainda não foi logicamente formada.
Exemplos
Exemplo 1: Encontrando os 5 Filmes Mais Curtos e Baratos
Neste exemplo, filtramos pelo custo de substituição primeiro, depois ordenamos pela duração e, finalmente, limitamos os resultados.
SELECT title, length, replacement_cost
FROM film
WHERE replacement_cost < 20.00
ORDER BY length ASC
LIMIT 5;
Exemplo 2: Aluguéis de Alto Valor Mais Recentes
Esta consulta encontra os 10 aluguéis mais recentes que duraram mais de 5 dias.
SELECT rental_id, rental_date, return_date
FROM rental
WHERE return_date - rental_date > 5
ORDER BY rental_date DESC
LIMIT 10;
Exemplo 3: Pesquisando por Atores Específicos
Encontre os primeiros 3 atores cujo sobrenome começa com 'B', ordenados alfabeticamente pelo primeiro nome.
SELECT first_name, last_name
FROM actor
WHERE last_name LIKE 'B%'
ORDER BY first_name
LIMIT 3;
Paginação com WHERE e ORDER BY
Na lição anterior, vimos a paginação básica usando LIMIT e OFFSET. Em aplicações reais, você geralmente pagina uma lista filtrada e ordenada.
Por que precisamos de WHERE e ORDER BY para paginação?
- Filtragem: Os usuários geralmente desejam ver um subconjunto específico de dados (por exemplo, produtos "Ativos" ou filmes de "Comédia").
- Consistência: Sem
ORDER BY, o banco de dados pode retornar linhas em uma ordem diferente toda vez que você for para a próxima página, fazendo com que alguns itens apareçam duas vezes e outros sejam perdidos.
Fórmula de Paginação
Para implementar a paginação para a "Página N" com "S" resultados por página:
LIMIT SOFFSET (N - 1) * S
Exemplo Combinado: Página 2 de Atores com 'A'
Se quisermos mostrar a segunda página (5 resultados por página) de atores cujo primeiro nome começa com 'A', ordenados pelo sobrenome:
SELECT first_name, last_name
FROM actor
WHERE first_name LIKE 'A%'
ORDER BY last_name
LIMIT 5 OFFSET 5; -- Página 2: Pula 5, pega 5
Principais conclusões desta lição:
- Siga a ordem sintática estrita:
WHERE->ORDER BY->LIMIT. - As condições da cláusula
WHEREsão aplicadas antes que a ordenação e a limitação ocorram. - Esta combinação é a base para a maioria dos relatórios de dados e listas "top-X" de interfaces de usuário.
- Sempre use
LIMITcomORDER BYse quiser que seus resultados sejam consistentes.
No próximo módulo, iremos além da simples recuperação de linhas e exploraremos as Funções de Agregação, que nos permitem calcular totais, médias e contagens em conjuntos de dados inteiros.