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:
- Top-N: top 10 de vendas da semana, top 3 de publicações por curtidas.
- Paginação: "página 2 de 100", 20 produtos por página.
- 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.):
SELECT * FROM products ORDER BY RANDOM() LIMIT 1;
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:
- Obtenha os 5 vídeos com mais curtidas.
- Obtenha a página 2 (3 vídeos por página), ordenados por visualizações decrescentes.
- 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.
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:
Sem
LIMIT, a consulta retorna tudo. Em tabelas grandes isso significa:Sintaxe básica
SELECT * FROM table_name LIMIT N;Exemplo: uma tabela
videosde 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",
LIMITsem 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:
LIMITsemORDER BYsó 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 — escrevaORDER BY.Exemplo: serviço de streaming
Consulta: top 3 por visualizações.
SELECT title, views FROM videos ORDER BY views DESC LIMIT 3;Resultado:
Entram sete linhas, saem três. As que têm o
viewsmais 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
viewsdecrescente, pule 3 linhas, retorne as 3 seguintes".Resultado para a nossa tabela (posições 4-6 por visualizações):
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_sizePostgreSQL versus MySQL — quase idênticos
Ambos entendem
LIMIT NeLIMIT N OFFSET M. Diferenças rápidas:LIMIT M, N— pula M, retorna N. É considerada legada; useLIMIT N OFFSET Mno lugar.FETCH FIRST 10 ROWS ONLY(em vez deLIMIT 10) eOFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY. Verbosa, mas faz parte do SQL:2008. Na prática todo mundo simplesmente escreveLIMIT/OFFSET.Para iniciantes: lembre-se de
LIMIT N OFFSET M— funciona em ambos.Exemplo maior: paginação de e-commerce
Tabela
products: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:
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 1000000obriga 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
LIMITse 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.ORDER BY— caso contrário a ordem é imprevisível.Experimente você mesmo
Sobre a tabela
videos: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.