SQL LIMIT e OFFSET

A Loja Aurora tem 45 produtos, 30 clientes e 90 pedidos. Uma loja de verdade tem milhares. Muitas vezes você não quer a lista inteira: quer só os 3 produtos mais caros, o pedido mais recente, ou a página 2 da vitrine do site, com 10 produtos por página. Para isso existem o LIMIT ("limite"), que diz quantas linhas você quer, e o OFFSET ("deslocamento"), que diz quantas linhas pular antes de começar.

Você vai aprender
  • Pegar só as primeiras N linhas com LIMIT.
  • Por que o LIMIT quase sempre anda junto com o ORDER BY.
  • Pular linhas com OFFSET e montar a paginação de uma lista.
  • O que acontece com empates na última posição, e como desempatar.
  • A forma curta LIMIT 10, 3 e por que ela confunde.
  • Como os outros bancos fazem a mesma coisa: TOP (SQL Server) e FETCH FIRST (o padrão SQL, PostgreSQL e Oracle).

Antes desta aula, veja ORDER BY: as duas coisas trabalham juntas o tempo todo. Os exemplos usam o banco da Loja Aurora, e cada quadro "Resultado" vem do SQLite de verdade, rodando no seu navegador.


A ideia: o pódio

Numa corrida, todo mundo cruza a linha de chegada, mas o pódio tem só 3 lugares. Para montar o pódio, você precisa de duas coisas, nesta ordem:

  1. Arrumar os corredores pelo tempo de chegada (é o ORDER BY).
  2. Cortar a lista depois do 3º (é o LIMIT 3).

Cortar sem arrumar antes não faz sentido: você pegaria "três corredores quaisquer". É exatamente o que acontece com um LIMIT sem ORDER BY, como você vai ver na seção 2.


1. O primeiro LIMIT: os 3 mais caros

SELECT nome, preco
FROM produtos
ORDER BY preco DESC
LIMIT 3;
ORDER BY preco DESC
Arruma os 45 produtos do mais caro para o mais barato.
LIMIT
"Limite": quantas linhas, no máximo, o resultado pode ter. Vem depois do ORDER BY, no fim de tudo.
3
O número de linhas. O SQLite entrega as 3 primeiras da lista já arrumada e para.

O pódio da Loja Aurora: o Jogo de Panelas (249.9), a Caixa de Som (189.99) e o Fone de Ouvido (129.9).

Trocando o sentido da ordem, o mesmo LIMIT dá o contrário. E com LIMIT 1 você pega "o mais" alguma coisa: o pedido mais recente da loja é o primeiro da lista arrumada pela data, de trás para a frente:

SELECT id, cliente_id, data, frete
FROM pedidos
ORDER BY data DESC
LIMIT 1;

O pedido 90, de 14 de outubro de 2026.

Experimente: a consulta abaixo lista todos os produtos do mais barato para o mais caro. Acrescente um LIMIT para mostrar só os 5 mais baratos.

SELECT nome, preco
FROM produtos
ORDER BY preco;
SELECT nome, preco
FROM produtos
ORDER BY preco
LIMIT 5;

2. LIMIT sem ORDER BY: "quaisquer três"

O LIMIT funciona sozinho, sem erro nenhum:

SELECT nome, preco
FROM produtos
LIMIT 3;

Vieram o Caderno, a Caneta e o Lápis: os 3 primeiros na ordem em que estão guardados. Isso serve para espiar uma tabela ("me mostre umas linhas para eu ver como ela é"). Mas não responda nenhuma pergunta com isso: sem ORDER BY, o banco não promete ordem nenhuma, e "os 3 primeiros" pode mudar de um dia para o outro. A documentação do PostgreSQL avisa que, sem ORDER BY, a mesma consulta com LIMIT pode até devolver linhas diferentes cada vez que roda.

Regra prática

Viu um LIMIT, procure o ORDER BY. Se ele não estiver lá, a consulta responde "quaisquer N linhas", e quase nunca é isso que se quer.


3. OFFSET: pular linhas

O OFFSET manda o SQLite pular algumas linhas antes de começar a entregar. Quem é o funcionário com o segundo maior salário?

SELECT nome, salario
FROM funcionarios
ORDER BY salario DESC
LIMIT 1 OFFSET 1;
ORDER BY salario DESC
Arruma do maior salário para o menor: Marta, Luana, Renata…
OFFSET 1
Pula 1 linha (a Marta, que tem o maior).
LIMIT 1
Depois de pular, entrega 1 linha: a Luana Castelo, com 5400.25.

Repare: o SQLite primeiro pula, depois conta. OFFSET 1 quer dizer "comece pela 2ª linha"; OFFSET 0 é o mesmo que não ter OFFSET.


4. Paginação: a vitrine em páginas

O site da loja mostra os produtos em páginas de 10. Com os 45 produtos ordenados por id, a página 1 são os 10 primeiros:

SELECT id, nome
FROM produtos
ORDER BY id
LIMIT 10;

A página 2 pula os 10 da página 1 e pega os 10 seguintes:

SELECT id, nome
FROM produtos
ORDER BY id
LIMIT 10 OFFSET 10;

A conta de cada página é sempre a mesma:

PáginaOFFSET = (página − 1) × 10SQLProdutos
10LIMIT 10 OFFSET 0ids 1 a 10
210LIMIT 10 OFFSET 10ids 11 a 20
320LIMIT 10 OFFSET 20ids 21 a 30
430LIMIT 10 OFFSET 30ids 31 a 40
540LIMIT 10 OFFSET 40ids 41 a 45 (só 5)
650LIMIT 10 OFFSET 50nenhum (0 linhas)

A última página tem só 5 produtos, e isso não é erro: o LIMIT é um máximo. Se sobrarem menos linhas, vêm as que sobraram. Veja a página 5:

SELECT id, nome
FROM produtos
ORDER BY id
LIMIT 10 OFFSET 40;

E se o OFFSET pular tudo (página 6, OFFSET 50), o resultado vem vazio, também sem erro. É assim que um site sabe que "não há mais páginas".

Missão: a lista de clientes em ordem alfabética tem páginas de 5 clientes. A consulta abaixo mostra a página 1. Mude-a para mostrar a página 3.

SELECT nome, cidade
FROM clientes
ORDER BY nome
LIMIT 5;
SELECT nome, cidade
FROM clientes
ORDER BY nome
LIMIT 5 OFFSET 10;
Ordene por algo que não se repete

Na paginação, ordene por uma coluna (ou combinação de colunas) que não tem valores repetidos, como o id. Se várias linhas empatam no ORDER BY, a ordem entre elas não é garantida, e uma linha pode aparecer em duas páginas, ou em nenhuma. A documentação do SQL Server faz o mesmo alerta para a paginação dele. Veja os empates na próxima seção.


5. Empates no último lugar

A Ana quer os 7 produtos com mais unidades no estoque:

SELECT nome, estoque
FROM produtos
ORDER BY estoque DESC
LIMIT 7;

O 7º lugar é o Cabo HDMI, com 95. Mas a Garrafa Squeeze também tem 95 unidades, e ficou de fora. O LIMIT não sabe de empates: ele corta na 7ª linha e pronto. E qual dos dois empatados fica com o 7º lugar? Sem um desempate, quem decide é o banco.

Duas saídas:

  • Desempatar com uma segunda coluna no ORDER BY, para que o resultado seja sempre o mesmo: ORDER BY estoque DESC, nome (empatou no estoque, vai o nome em ordem alfabética).
  • Incluir os empatados: veja quantos são e aumente o limite. Com LIMIT 8, os dois de 95 entram:
SELECT nome, estoque
FROM produtos
ORDER BY estoque DESC, nome
LIMIT 8;

Alguns bancos têm um recurso pronto para "trazer também os empatados" (WITH TIES, em Nos outros bancos). O SQLite não tem.


6. LIMIT e os valores vazios

Quem é o cliente mais velho? A primeira ideia é ordenar pelo nascimento e pegar 1:

SELECT nome, nascimento
FROM clientes
ORDER BY nascimento
LIMIT 1;

Veio o Antônio Carlos Neves, que não tem data de nascimento. Lembra da aula de ORDER BY? No SQLite, o NULL vem primeiro na ordem crescente. O LIMIT 1 pegou exatamente esse vazio. Mande os vazios para o fim e pergunte de novo:

SELECT nome, nascimento
FROM clientes
ORDER BY nascimento NULLS LAST
LIMIT 1;

Agora sim: a Conceição Prado, de 1965.


7. Formas diferentes de escrever

O SQLite aceita uma forma curta, com vírgula: LIMIT pular, quantos. Ela também existe no MySQL. Mas cuidado com a ordem dos números:

SELECT id, nome
FROM produtos
ORDER BY id
LIMIT 10, 3;

Vieram 3 produtos (ids 11, 12 e 13), depois de pular 10. Na forma com vírgula, o primeiro número é o que se pula e o segundo é quantos vêm, o contrário da ordem em que você lê LIMIT 3 OFFSET 10. É fácil trocar os dois sem perceber.

EscritaPulaEntregaObservação
LIMIT 3 OFFSET 10103A mais clara: cada número tem nome
LIMIT 10, 3103Curta, mas os números ficam "ao contrário"
LIMIT 303Sem OFFSET: começa da primeira
LIMIT 0—0Nenhuma linha (só os nomes das colunas)
LIMIT -1—todasNo SQLite, um número negativo quer dizer "sem limite"
LIMIT 2 * 306Aceita uma conta, desde que dê um número inteiro
SituaçãoQual usar
"Os N maiores / menores / mais recentes"ORDER BY … LIMIT N
"O 2º, o 3º…"ORDER BY … LIMIT 1 OFFSET N
PaginaçãoORDER BY id LIMIT tamanho OFFSET (página − 1) × tamanho
Só espiar a tabelaLIMIT 5 sem ORDER BY serve
SQL que precisa rodar em outros bancosLIMIT … OFFSET … (SQLite, MySQL, PostgreSQL) ou OFFSET … FETCH (padrão; veja abaixo)

Quando dá errado

LIMIT antes do ORDER BY
SELECT nome, preco FROM produtos LIMIT 3 ORDER BY preco;

A mensagem: near "ORDER": syntax error. A ordem das partes é fixa, e o LIMIT é a última: SELECT → FROM → WHERE → ORDER BY → LIMIT. Faz sentido: primeiro arruma, depois corta.

Como consertar: … ORDER BY preco LIMIT 3;

OFFSET sem LIMIT
SELECT nome, preco FROM produtos OFFSET 5;

A mensagem: near "5": syntax error. No SQLite, o OFFSET só existe dentro de um LIMIT. Sem o LIMIT, a palavra OFFSET é lida como um apelido para a tabela, e o SQLite tropeça no 5.

Como consertar: para "pular 5 e trazer o resto", use LIMIT -1 OFFSET 5.

Um número que não é inteiro
SELECT nome, preco FROM produtos ORDER BY preco LIMIT 2.5;

A mensagem: datatype mismatch, "tipo de dado não confere". O LIMIT conta linhas, e não existe meia linha. O mesmo erro aparece com um texto, como LIMIT 'tres'.

Usou o TOP do SQL Server
SELECT TOP 3 nome, preco FROM produtos;

A mensagem: near "3": syntax error. O SQLite não conhece o TOP; ele acha que TOP é o nome de uma coluna e não entende o 3 logo depois. Quem aprendeu SQL no SQL Server tropeça muito nisso.

Como consertar: no SQLite, SELECT nome, preco FROM produtos ORDER BY preco DESC LIMIT 3;

O FETCH FIRST do padrão
SELECT nome, preco FROM produtos ORDER BY preco FETCH FIRST 3 ROWS ONLY;

A mensagem: near "FETCH": syntax error. O FETCH FIRST é a forma do padrão SQL, mas o SQLite não a implementa. Aqui, só LIMIT.

Sem erro, mas a resposta errada

Dois casos desta aula não dão mensagem nenhuma e mesmo assim trazem a resposta errada:

  • LIMIT sem ORDER BY (seção 2): você recebe linhas quaisquer.
  • ORDER BY nascimento LIMIT 1 com uma coluna que tem NULL (seção 6): você recebe o vazio no lugar do "mais velho".
Nos outros bancos

O LIMIT não faz parte do padrão SQL: a documentação do PostgreSQL o chama de sintaxe própria dele, "também usada pelo MySQL". O padrão (desde o SQL:2008) é o OFFSET … FETCH. Cada banco escolheu o seu:

BancoOs 3 mais carosPágina 2 (10 por página)
SQLite, MySQL, MariaDBORDER BY preco DESC LIMIT 3ORDER BY id LIMIT 10 OFFSET 10
PostgreSQLLIMIT 3 ou FETCH FIRST 3 ROWS ONLYLIMIT 10 OFFSET 10 ou OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
Oracle (12c em diante)FETCH FIRST 3 ROWS ONLYOFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
SQL ServerSELECT TOP (3) …OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY (exige ORDER BY)

Ilustrativo (não roda no SQLite):

-- SQL Server: o TOP vem logo depois do SELECT
SELECT TOP (3) nome, preco
FROM produtos
ORDER BY preco DESC;

-- SQL Server: página 2, com OFFSET e FETCH no fim do ORDER BY
SELECT id, nome
FROM produtos
ORDER BY id
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
-- Padrão SQL (PostgreSQL, Oracle 12c+)
SELECT nome, preco
FROM produtos
ORDER BY preco DESC
FETCH FIRST 3 ROWS ONLY;

-- Com WITH TIES, os empatados no último lugar também vêm
SELECT nome, estoque
FROM produtos
ORDER BY estoque DESC
FETCH FIRST 7 ROWS WITH TIES;

As palavras FIRST/NEXT e ROW/ROWS são sinônimas, só para a frase ficar natural em inglês ("pegue as próximas 10 linhas apenas"). O WITH TIES existe no PostgreSQL, no Oracle e no SQL Server (TOP (7) WITH TIES), e sempre exige ORDER BY. Nos bancos Oracle antigos, antes do 12c, usava-se a pseudo-coluna ROWNUM; você vai vê-la em código legado.


Referência rápida

EscritaO que faz
LIMIT nNo máximo n linhas
LIMIT n OFFSET pPula p linhas e entrega no máximo n
LIMIT p, nO mesmo, na forma curta (atenção à ordem)
LIMIT -1 OFFSET pPula p e entrega todo o resto
ORDER BY … LIMIT 1"O mais…" (caro, recente, velho)
Página k com t por páginaLIMIT t OFFSET (k − 1) × t
Ordem das partesSELECT → FROM → WHERE → ORDER BY → LIMIT
Mensagem do SQLiteQuer dizer
near "ORDER": syntax errorLIMIT antes do ORDER BY
near "5": syntax error (em OFFSET 5)OFFSET sem LIMIT
datatype mismatchLIMIT com um número quebrado ou com texto
near "3": syntax error (em TOP 3)O TOP do SQL Server não existe no SQLite
near "FETCH": syntax errorO FETCH FIRST do padrão não existe no SQLite

Exercícios

1. Os 10 primeiros

Complete para trazer só 10 produtos:

SELECT nome FROM produtos ORDER BY nome 10;

2. A conta da paginação

Com 20 produtos por página, qual é o OFFSET da página 4?

LIMIT 20 OFFSET

3. Quantas linhas LIMIT 10 OFFSET 40 devolve numa tabela com 45 linhas?

4. O que LIMIT 10, 3 faz no SQLite?

5. A Ana escreveu SELECT nome FROM produtos LIMIT 3; para descobrir os 3 produtos mais vendidos. O que está errado?

6. No SQL Server, qual é o equivalente de ORDER BY preco DESC LIMIT 3?

Missão final: a página 2 da vitrine

Missão: a vitrine do site mostra os produtos do mais caro para o mais barato, 4 por página. Escreva a consulta da página 2 (o primeiro produto dela é o Teclado Compacto).

SELECT nome, preco
FROM produtos
ORDER BY preco DESC;
SELECT nome, preco
FROM produtos
ORDER BY preco DESC
LIMIT 4 OFFSET 4;

Resumo

  • LIMIT n entrega no máximo n linhas; OFFSET p pula p linhas antes. No SQLite, o OFFSET só existe junto do LIMIT.
  • O LIMIT é a última parte: SELECT → FROM → WHERE → ORDER BY → LIMIT.
  • Use LIMIT com ORDER BY: sem ordem, "os primeiros" são linhas quaisquer.
  • Paginação: LIMIT tamanho OFFSET (página − 1) × tamanho, ordenando por algo que não se repete (como o id). Faltando linhas, vem menos; passou do fim, vem vazio, sem erro.
  • O LIMIT corta empates sem avisar; desempate com uma segunda coluna no ORDER BY.
  • Cuidado com NULL: em ORDER BY coluna LIMIT 1, o vazio pode ganhar o primeiro lugar. Use NULLS LAST.
  • Nos outros bancos: TOP no SQL Server, FETCH FIRST … ROWS ONLY no padrão SQL, no PostgreSQL e no Oracle.