SQLLIMITtutorialbeginner

O que é LIMIT no SQL? Limitar o número de linhas para iniciantes

LIMIT limita o resultado de uma consulta a N linhas. Essencial para a paginação, as consultas top-N e as prévias. Cobrimos a sintaxe, OFFSET, as diferenças entre PostgreSQL e MySQL, os erros comuns e três exercícios práticos.

6 min de leituraReferenceSQL · LIMIT · tutorial · beginner

LIMIT é a cláusula do SQL que diz "me dê no máximo N linhas". Simples, e incrivelmente útil.

Imagine uma tabela com 50.000 vídeos. Quando você abre o YouTube, não vê os 50.000 — a página inicial mostra 12-20 recomendações. Isso é LIMIT. O mesmo vale para a paginação do e-commerce, os placares dos jogos, as páginas de um feed social, as prévias de um painel de administração.

Por que LIMIT importa

Três cenários clássicos:

  1. Top-N: top 10 de vendas da semana, top 3 de publicações por curtidas.
  2. Paginação: "página 2 de 100", 20 produtos por página.
  3. Prévia / verificação rápida: enquanto depura, você quer dar uma espiada nas primeiras 5 linhas para ver como os dados são.

Sem LIMIT, a consulta retorna tudo. Em tabelas grandes isso significa:

  • Lento — milhões de linhas pela rede.
  • Inútil — o usuário não vai ver tantas de qualquer forma.
  • Arriscado — o seu aplicativo pode ficar sem memória.

Sintaxe básica

SELECT *
FROM table_name
LIMIT N;

Exemplo: uma tabela videos de um serviço de streaming.

SELECT title, views
FROM videos
LIMIT 5;

Retorna as primeiras 5 linhas. Quais 5 — sem ORDER BY, imprevisível. O banco de dados as escolhe "como estão".

LIMIT quase sempre vem com ORDER BY

Se você quer "o top 5 por visualizações", LIMIT sem ordenação te dá 5 linhas aleatórias. Você precisa deixar claro a ordem:

SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 5;

Agora é "os 5 vídeos mais vistos". O banco de dados ordena primeiro e depois trunca.

Regra prática: LIMIT sem ORDER BY só faz sentido em três casos — prévia durante o desenvolvimento, escolher uma linha aleatória (ORDER BY RANDOM()), depuração. Em todo o resto — escreva ORDER BY.

Exemplo: serviço de streaming

id title author views likes
1 Learn SQL in 30 minutes Code Academy 250000 12000
2 Cats compile code Funny Devs 1200000 95000
3 JOINs explained simply DB Guru 80000 4500
4 A coder's borscht recipe Tech Cooks 30000 1800
5 10 mistakes in SELECT DB Guru 150000 8900
6 Top React hooks 2024 Web Dev 500000 25000
7 A short history of Linux OS Lessons 90000 5500

Consulta: top 3 por visualizações.

SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 3;

Resultado:

title views
Cats compile code 1200000
Top React hooks 2024 500000
Learn SQL in 30 min 250000

Entram sete linhas, saem três. As que têm o views mais alto.

OFFSET — pular as primeiras N linhas

A cláusula companheira de LIMIT é OFFSET. Ela pula N linhas antes de começar a retornar.

SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 3 OFFSET 3;

Lê-se como: "ordene por views decrescente, pule 3 linhas, retorne as 3 seguintes".

Resultado para a nossa tabela (posições 4-6 por visualizações):

title views
Learn SQL in 30 min 250000
10 mistakes in SELECT 150000
A history of Linux 90000

Isso é a paginação. Página 1 — LIMIT 3 OFFSET 0. Página 2 — LIMIT 3 OFFSET 3. Página 3 — LIMIT 3 OFFSET 6.

A fórmula da paginação:

LIMIT page_size OFFSET (page_number - 1) * page_size

PostgreSQL versus MySQL — quase idênticos

Ambos entendem LIMIT N e LIMIT N OFFSET M. Diferenças rápidas:

  • MySQL também aceita uma forma abreviada LIMIT M, N — pula M, retorna N. É considerada legada; use LIMIT N OFFSET M no lugar.
  • PostgreSQL também fala a forma padrão do SQL: FETCH FIRST 10 ROWS ONLY (em vez de LIMIT 10) e OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY. Verbosa, mas faz parte do SQL:2008. Na prática todo mundo simplesmente escreve LIMIT/OFFSET.

Para iniciantes: lembre-se de LIMIT N OFFSET M — funciona em ambos.

Exemplo maior: paginação de e-commerce

Tabela products:

id name category price popularity
1 iPhone 15 Electronics 999 980
2 Bosch kettle Appliances 49 320
3 Book "Clean Code" Books 22 850
4 DeLonghi coffee maker Appliances 380 410
5 MacBook Air Electronics 1450 920
6 Book "SQL in a Month" Books 17 670
7 Pixel 8 Electronics 830 740
8 LG fridge Appliances 720 280
9 Slow cooker Appliances 89 560
10 Book "JavaScript" Books 20 510

Objetivo: mostrar a página 2 (4 produtos por página), ordenados por popularidade.

SELECT id, name, popularity
FROM products
ORDER BY popularity DESC
LIMIT 4 OFFSET 4;

Resultado:

id name popularity
7 Pixel 8 740
6 Book "SQL in a Month" 670
9 Slow cooker 560
10 Book "JavaScript" 510

Página 1 (os mais populares): iPhone 15, MacBook Air, Book "Clean Code", Pixel 8. Página 2: as linhas 5-8 por popularidade. A página 3 seria OFFSET 8.

Amostragem aleatória

Combinação para uma linha aleatória (útil para desafios diários, recurso do dia, etc.):

-- PostgreSQL
SELECT * FROM products ORDER BY RANDOM() LIMIT 1;

-- MySQL
SELECT * FROM products ORDER BY RAND() LIMIT 1;

Atenção: em tabelas grandes RANDOM() / RAND() é pesado — o banco de dados precisa gerar um número aleatório por linha e ordenar. Tudo bem para tabelas pequenas, doloroso para milhões de linhas. Para essas, use outros truques (por exemplo, WHERE id = ROUND(RANDOM() * (SELECT MAX(id) FROM products))).

Erros comuns de iniciante

1. LIMIT sem ORDER BY, esperando uma ordem. As pessoas presumem que "o banco de dados retorna na ordem de inserção". Não retorna. Precisa de uma ordem? Escreva ORDER BY.

2. Paginação sem ORDER BY. O bug mais traiçoeiro. Sem ordenação, a página 2 pode conter linhas da página 1, e o usuário vê duplicados. Ordene sempre por uma coluna única (normalmente id).

3. OFFSETs enormes. OFFSET 1000000 obriga o banco de dados a gerar um milhão de linhas e depois jogá-las fora. Lento. Para tabelas grandes prefira a paginação por chave (keyset): WHERE id > last_seen_id LIMIT N.

4. LIMIT com UNION. Se você quer que LIMIT se aplique a todo o UNION, coloque entre parênteses ou ponha ORDER BY/LIMIT bem no final:

(SELECT name FROM authors UNION SELECT name FROM editors)
ORDER BY name
LIMIT 10;

5. LIMIT negativo ou LIMIT 0. LIMIT 0 é válido — retorna 0 linhas (ocasionalmente útil para verificar uma consulta sem trazer dados). Números negativos lançam um erro.

6. LIMIT em UPDATE/DELETE — depende do banco de dados. O MySQL permite UPDATE … LIMIT 100. O PostgreSQL não — você precisa usar uma subconsulta ou um CTE.

Resumo rápido

  • LIMIT N — retorna no máximo N linhas.
  • OFFSET M — pula M linhas antes de começar.
  • Quase sempre acompanhado de ORDER BY — caso contrário a ordem é imprevisível.
  • Usado para top-N, paginação, prévias.
  • A mesma sintaxe no PostgreSQL e no MySQL.
  • OFFSETs enormes são lentos — prefira a paginação por chave em tabelas grandes.

Experimente você mesmo

Sobre a tabela videos:

  1. Obtenha os 5 vídeos com mais curtidas.
  2. Obtenha a página 2 (3 vídeos por página), ordenados por visualizações decrescentes.
  3. Escolha um vídeo aleatório para "o vídeo do dia".

Escreva as consultas por conta própria. Assim que você se sentir confortável com a combinação ORDER BY + LIMIT, metade de todas as consultas de leitura do mundo real se reduz a este padrão.

Pratique com exercícios reais

Resolva exercícios no treinador de SQL com correção instantânea e dicas.

Abrir o treinador