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.
O SQL possui uma ordem estrita para como essas cláusulas devem aparecer em sua consulta. Se você as colocar na ordem errada, o banco de dados retornará um erro.
A sequência correta é:
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)Quando você executa uma consulta combinada, o banco de dados a processa conceitualmente assim:
FROM.WHERE.ORDER BY.LIMIT para fornecer apenas a parte que você solicitou.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;
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;
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;
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.
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.Para implementar a paginação para a "Página N" com "S" resultados por página:
LIMIT SOFFSET (N - 1) * SSe 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:
WHERE -> ORDER BY -> LIMIT.WHERE são aplicadas antes que a ordenação e a limitação ocorram.LIMIT com ORDER BY se 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.