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.
- Pegar só as primeiras N linhas com
LIMIT. - Por que o
LIMITquase sempre anda junto com oORDER BY. - Pular linhas com
OFFSETe montar a paginação de uma lista. - O que acontece com empates na última posição, e como desempatar.
- A forma curta
LIMIT 10, 3e por que ela confunde. - Como os outros bancos fazem a mesma coisa:
TOP(SQL Server) eFETCH 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:
- Arrumar os corredores pelo tempo de chegada (é o
ORDER BY). - 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.
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ágina | OFFSET = (página − 1) × 10 | SQL | Produtos |
|---|---|---|---|
| 1 | 0 | LIMIT 10 OFFSET 0 | ids 1 a 10 |
| 2 | 10 | LIMIT 10 OFFSET 10 | ids 11 a 20 |
| 3 | 20 | LIMIT 10 OFFSET 20 | ids 21 a 30 |
| 4 | 30 | LIMIT 10 OFFSET 30 | ids 31 a 40 |
| 5 | 40 | LIMIT 10 OFFSET 40 | ids 41 a 45 (só 5) |
| 6 | 50 | LIMIT 10 OFFSET 50 | nenhum (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;
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.
| Escrita | Pula | Entrega | Observação |
|---|---|---|---|
LIMIT 3 OFFSET 10 | 10 | 3 | A mais clara: cada número tem nome |
LIMIT 10, 3 | 10 | 3 | Curta, mas os números ficam "ao contrário" |
LIMIT 3 | 0 | 3 | Sem OFFSET: começa da primeira |
LIMIT 0 | — | 0 | Nenhuma linha (só os nomes das colunas) |
LIMIT -1 | — | todas | No SQLite, um número negativo quer dizer "sem limite" |
LIMIT 2 * 3 | 0 | 6 | Aceita uma conta, desde que dê um número inteiro |
| Situação | Qual usar |
|---|---|
| "Os N maiores / menores / mais recentes" | ORDER BY … LIMIT N |
| "O 2º, o 3º…" | ORDER BY … LIMIT 1 OFFSET N |
| Paginação | ORDER BY id LIMIT tamanho OFFSET (página − 1) × tamanho |
| Só espiar a tabela | LIMIT 5 sem ORDER BY serve |
| SQL que precisa rodar em outros bancos | LIMIT … OFFSET … (SQLite, MySQL, PostgreSQL) ou OFFSET … FETCH (padrão; veja abaixo) |
Quando dá errado
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;
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.
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'.
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;
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.
Dois casos desta aula não dão mensagem nenhuma e mesmo assim trazem a resposta errada:
LIMITsemORDER BY(seção 2): você recebe linhas quaisquer.ORDER BY nascimento LIMIT 1com uma coluna que temNULL(seção 6): você recebe o vazio no lugar do "mais velho".
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:
| Banco | Os 3 mais caros | Página 2 (10 por página) |
|---|---|---|
| SQLite, MySQL, MariaDB | ORDER BY preco DESC LIMIT 3 | ORDER BY id LIMIT 10 OFFSET 10 |
| PostgreSQL | LIMIT 3 ou FETCH FIRST 3 ROWS ONLY | LIMIT 10 OFFSET 10 ou OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY |
| Oracle (12c em diante) | FETCH FIRST 3 ROWS ONLY | OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY |
| SQL Server | SELECT 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
| Escrita | O que faz |
|---|---|
LIMIT n | No máximo n linhas |
LIMIT n OFFSET p | Pula p linhas e entrega no máximo n |
LIMIT p, n | O mesmo, na forma curta (atenção à ordem) |
LIMIT -1 OFFSET p | Pula p e entrega todo o resto |
ORDER BY … LIMIT 1 | "O mais…" (caro, recente, velho) |
| Página k com t por página | LIMIT t OFFSET (k − 1) × t |
| Ordem das partes | SELECT → FROM → WHERE → ORDER BY → LIMIT |
| Mensagem do SQLite | Quer dizer |
|---|---|
near "ORDER": syntax error | LIMIT antes do ORDER BY |
near "5": syntax error (em OFFSET 5) | OFFSET sem LIMIT |
datatype mismatch | LIMIT 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 error | O FETCH FIRST do padrão não existe no SQLite |
Exercícios
1. Os 10 primeiros
Complete para trazer só 10 produtos:
2. A conta da paginação
Com 20 produtos por página, qual é o OFFSET da página 4?
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 nentrega no máximonlinhas;OFFSET ppulaplinhas antes. No SQLite, oOFFSETsó existe junto doLIMIT.- O
LIMITé a última parte:SELECT→FROM→WHERE→ORDER BY→LIMIT. - Use
LIMITcomORDER 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 oid). Faltando linhas, vem menos; passou do fim, vem vazio, sem erro. - O
LIMITcorta empates sem avisar; desempate com uma segunda coluna noORDER BY. - Cuidado com
NULL: emORDER BY coluna LIMIT 1, o vazio pode ganhar o primeiro lugar. UseNULLS LAST. - Nos outros bancos:
TOPno SQL Server,FETCH FIRST … ROWS ONLYno padrão SQL, no PostgreSQL e no Oracle.