🚀 Novembro começou! O SQLtest.online continua gratuito graças às doações de pessoas como você. Ajude-nos a atingir a meta deste mês mais cedo para que o site continue funcionando sem interrupções. Apoiar agora →
Código SQL copiado para a área de transferência

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.

SQL LIMIT e OFFSET: num resultado ordenado, OFFSET pula linhas e LIMIT pega as seguintes, usado em listas top-N e paginação

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 S
  • OFFSET (N - 1) * S
Página10 linhas por página
1LIMIT 10 OFFSET 0 (linhas 1–10)
2LIMIT 10 OFFSET 10 (linhas 11–20)
3LIMIT 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 dadosPrimeiras 5 linhas
MySQL, MariaDB, PostgreSQL, SQLiteLIMIT 5
SQL ServerSELECT TOP 5 ... ou OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY
Oracle 12c+, PostgreSQL, padrão SQLFETCH FIRST 5 ROWS ONLY

Principais conclusões:

  • LIMIT n devolve no máximo n linhas.
  • OFFSET n pula n linhas antes de devolver o resultado.
  • Use sempre LIMIT com ORDER BY e torne a ordenação única para que o resultado seja estável.
  • Página N com S linhas: LIMIT S OFFSET (N - 1) * S.
  • O SQL Server usa TOP, e o padrão SQL usa FETCH 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.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Obtenha os primeiros 10 filmes em ordem alfabética
  2. Os cinco filmes mais longos
  3. Obtenha a terceira página da lista de filmes
  4. Obtenha o filme mais longo
  5. Dez produtos mais pesados