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 leituraSQL · 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

idtitleauthorviewslikes
1Learn SQL in 30 minutesCode Academy25000012000
2Cats compile codeFunny Devs120000095000
3JOINs explained simplyDB Guru800004500
4A coder's borscht recipeTech Cooks300001800
510 mistakes in SELECTDB Guru1500008900
6Top React hooks 2024Web Dev50000025000
7A short history of LinuxOS Lessons900005500

Consulta: top 3 por visualizações.

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

Resultado:

titleviews
Cats compile code1200000
Top React hooks 2024500000
Learn SQL in 30 min250000

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):

titleviews
Learn SQL in 30 min250000
10 mistakes in SELECT150000
A history of Linux90000

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:

idnamecategorypricepopularity
1iPhone 15Electronics999980
2Bosch kettleAppliances49320
3Book "Clean Code"Books22850
4DeLonghi coffee makerAppliances380410
5MacBook AirElectronics1450920
6Book "SQL in a Month"Books17670
7Pixel 8Electronics830740
8LG fridgeAppliances720280
9Slow cookerAppliances89560
10Book "JavaScript"Books20510

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:

idnamepopularity
7Pixel 8740
6Book "SQL in a Month"670
9Slow cooker560
10Book "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