SQL LIMIT e OFFSET: Primeiras N Linhas e Paginação
Lição 2.7 · Tempo de leitura: ~5 min · Tarefas para praticar ↓
A cláusula SQL LIMIT restringe quantas linhas uma consulta devolve, e OFFSET pula um número de linhas antes de devolver o resto. Nesta lição, você vai aprender a obter as primeiras N linhas, a construir uma paginação, por que LIMIT precisa de ORDER BY e como outros bancos de dados escrevem a mesma coisa.
As tabelas costumam ter milhares ou milhões de linhas, e raramente é preciso ter todas de uma vez. Um relatório precisa dos 10 primeiros itens, uma aplicação mostra 20 resultados por página. LIMIT e OFFSET devolvem exatamente a parte do resultado de que você precisa.
A Cláusula LIMIT
LIMIT define o número máximo de linhas no resultado. É escrita no fim da consulta, depois de ORDER BY.
Sintaxe Básica
SELECT column1, column2, ...
FROM table_name
ORDER BY column_name
LIMIT row_count;
SELECT title, length
FROM film
ORDER BY length DESC
LIMIT 5;
Resultado: os 5 filmes mais longos.
Por Que LIMIT Precisa de ORDER BY
Sem ORDER BY, o banco de dados devolve as linhas na ordem que lhe for mais conveniente, então "as primeiras 5 linhas" podem ser diferentes a cada execução. Ordene sempre antes de limitar.
A ordenação também precisa ser única. Na consulta acima, vários filmes têm a mesma duração de 185 minutos, e é o banco de dados que decide quais deles entram no top 5. Adicione uma coluna que desempate:
SELECT title, length
FROM film
ORDER BY length DESC, title
LIMIT 5;
Resultado: os 5 filmes mais longos; filmes com a mesma duração são ordenados pelo título, então o resultado é igual em todas as execuções.
A Cláusula OFFSET
OFFSET pula um número de linhas antes de LIMIT começar a contar:
SELECT actor_id, first_name, last_name
FROM actor
ORDER BY actor_id
LIMIT 5 OFFSET 10;
Resultado: os atores 11 a 15 por actor_id: as primeiras 10 linhas são puladas e as 5 seguintes são devolvidas.
MySQL e MariaDB também aceitam a forma curta LIMIT 10, 5, em que o primeiro número é o deslocamento e o segundo é o número de linhas. A forma explícita LIMIT 5 OFFSET 10 é mais fácil de ler e funciona também no PostgreSQL e no SQLite.
Paginação com LIMIT e OFFSET
A paginação divide um resultado longo em páginas. Para a página N com S linhas por página:
LIMIT SOFFSET (N - 1) * S
| Página | 10 linhas por página |
|---|---|
| 1 | LIMIT 10 OFFSET 0 (linhas 1–10) |
| 2 | LIMIT 10 OFFSET 10 (linhas 11–20) |
| 3 | LIMIT 10 OFFSET 20 (linhas 21–30) |
SELECT film_id, title
FROM film
ORDER BY title, film_id
LIMIT 10 OFFSET 20;
Resultado: a página 3 da lista de filmes ordenada pelo título.
O banco de dados continua a ler e pular todas as linhas do deslocamento, por isso deslocamentos muito grandes (página 10 000) ficam lentos. Para paginação profunda, as aplicações costumam guardar o último valor da página anterior e filtrar com WHERE.
LIMIT em Outros Bancos de Dados
LIMIT é suportado pelo MySQL, MariaDB, PostgreSQL e SQLite. Outros bancos de dados usam uma sintaxe diferente:
| Banco de dados | Primeiras 5 linhas |
|---|---|
| MySQL, MariaDB, PostgreSQL, SQLite | LIMIT 5 |
| SQL Server | SELECT TOP 5 ... ou OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY |
| Oracle 12c+, PostgreSQL, padrão SQL | FETCH FIRST 5 ROWS ONLY |
Principais conclusões:
LIMIT ndevolve no máximonlinhas.OFFSET npulanlinhas antes de devolver o resultado.- Use sempre
LIMITcomORDER BYe torne a ordenação única para que o resultado seja estável. - Página
NcomSlinhas:LIMIT S OFFSET (N - 1) * S. - O SQL Server usa
TOP, e o padrão SQL usaFETCH FIRST n ROWS ONLY.
Perguntas Frequentes
Qual é a diferença entre LIMIT e OFFSET?
LIMIT define quantas linhas devolver; OFFSET define quantas linhas pular antes. LIMIT 5 OFFSET 10 pula 10 linhas e devolve as 5 seguintes.
Qual é o equivalente de LIMIT no SQL Server?
SELECT TOP 5 ... para as primeiras linhas, ou ORDER BY ... OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY para paginação.
Por que uma consulta com LIMIT devolve linhas diferentes a cada vez?
Porque a consulta não tem ORDER BY, ou as colunas de ordenação têm valores iguais. Ordene por colunas que identifiquem cada linha de forma única, por exemplo adicionando a chave primária como última chave de ordenação.