LIMIT é uma cláusula SQL que especifica o número de linhas que devem ser retornadas no resultado de uma consulta.

Este recurso não está disponível em todos os SGBDS, como alternativa podem ser utilizadas as cláusulas TOP para SQL Server, ROWNUM para Oracle e FIRST para Firebird.

Visão geral

A utilização dessa cláusula é muito comum entre os desenvolvedores, podendo inclusive trabalhar em conjunto a cláusula ORDER BY como opção para trazer o menor ou maior valor de uma determinada coluna, de acordo com o parâmetro da ordenação.

Para este exemplo considere o seguinte cenário:

Uma escola possui uma tabela chamada aluno Tabela 1, responsável por armazenar a informação de todos os alunos da instituição, contendo nome, email e a identificação da turma do aluno.

id nome email Id_turma
1 João Fernando joao@gmail.com 1
2 Maria Carvalho maria@gmail.com 1
3 Bruna dos Santos bruna@gmail.com 2
4 Pedro da Silva pedro@gmail.com 2
5 Tiago Pereira tiago@gmail.com 1
Tabela 1. Estrutura da tabela aluno

Para trazer no resultado da consulta os três primeiros alunos, começando do primeiro, podemos utilizar o trecho de código abaixo:

SELECT
  *
FROM
  alunos
LIMIT
  0, 3

Nesta consulta solicitamos que apenas os três primeiros resultados fossem retornados através da cláusula LIMIT e, em seguida, informamos o número 0 que define o índice inicial, seguido do 3, que é o número de resultados que precisamos. Na linha 2 utilizamos o caractere asterisco (*) para solicitar que todas as colunas da tabela retornassem no resultado da consulta gerando o resultado na Tabela 2.


id nome email Id_turma
1 João Fernando joao@gmail.com 1
2 Maria Carvalho maria@gmail.com 1
3 Bruna dos Santos bruna@gmail.com 2
Tabela 2. Resultado da consulta utilizando a cláusula LIMIT 3

Sintaxe

SELECT
  [ coluna1, coluna2, ... | * ]
FROM
  [ tabela1 ]
LIMIT
  valor 
OFFSET 
  valor

ou

SELECT
  [ coluna1, coluna2, ... | * ]
FROM
  [ tabela1 ]
LIMIT
  [índice inicial , limite ] 

Na pratica

Exemplo 1

Para este exemplo, utilizaremos o LIMIT em conjunto com a cláusula ORDER BY para que os resultados retornados possam ser ordenados em ordem ascendente ou descendente, utilizando ASC ou DESC, conforme abaixo:

SELECT
  *
FROM
  alunos
ORDER BY
  nome ASC
LIMIT
  0, 3

id nome email id_turma
3 Bruna dos Santos bruna@gmail.com 2
1 João Fernando joao@gmail.com 1
2 Maria Carvalho maria@gmail.com 1
Tabela 3. Resultado da consulta utilizando ORDER BY nome

Exemplo 2

Para este exemplo utilizaremos o recurso OFFSET em conjunto com o LIMIT para informar registros a serem omitidos na resposta.

SELECT
  *
FROM
  alunos
ORDER BY
  nome ASC
LIMIT
  3
OFFSET
  1

O resultado da query acima pode ser visto na Tabela 4.

id nome email id_turma
1 João Fernando joao@gmail.com 1
2 Maria Carvalho maria@gmail.com 1
Tabela 4. Resultado da consulta utilizando OFFSET

Observe que na resposta o resultado foi ordenado pelo nome de forma ascendente, utilizando a cláusula ORDER BY ASC, e que limitamos a consulta a três registros. Porém, o primeiro resultado foi omitido (verificar na Tabela 1), pois utilizamos o recurso OFFSET com valor 1 (omite um resultado).

Exemplo 3

Para um exemplo um pouco mais complexo, considere o seguinte cenário:

Uma empresa chamada Tem de Tudo possui duas tabelas principais, a tabela produto (Tabela 5), responsável por armazenar todos os produtos da loja, e a tabela venda_produto (Tabela 6), responsável por gerenciar a saída desses produtos.


Id Nome preco
1 Bola 35.00
2 Patinete 120.00
3 Carrinho 15.00
4 Skate 296.00
5 Notebook 3500.00
6 Monitor LG 19 450.00
7 O Diário de Anne Frank 45.00
8 O dia do Curinga 65.00
9 O mundo de Sofia 48.00
10 Através do Espelho 38.00
Tabela 5. Tabela produto

Id Id_produto data valor
1 1 2018-07-15 35.00
2 2 2018-07-15 120.00
3 2 2018-07-14 120.00
4 3 2018-07-15 15.00
5 7 2018-07-15 45.00
6 8 2018-07-15 65.00
7 8 2018-07-16 65.00
8 9 2018-07-16 48.00
9 5 2018-07-16 3500.00
10 5 2018-07-16 3500.00
11 6 2018-07-16 450.00
12 1 2018-07-15 35.00
13 2 2018-07-15 120.00
Tabela 6. Tabela venda_produto

Suponhamos que a empresa Tem de tudo deseja saber quais os três produtos que tiveram o maior valor de receita. Para isso, podemos utilizar o fragmento de código abaixo:

SELECT
   P.nome,
   SUM(VN.valor) as TOTAL
  FROM 
   produto P, venda_produto VN
  WHERE 
   P.id = VN.id_produto
  GROUP BY
   P.id
  ORDER BY
   TOTAL DESC
  LIMIT 0, 3

Observe que no trecho de código acima, na linha 1 pedimos para listar os três primeiros registros.

Na linha 2 pedimos para que o valor da coluna valor seja somada. Nas linhas 4 e 5 informamos que a consulta será realizada na tabela produto, nomeada de P, e na tabela venda_produto, nomeada VN.

Em seguida, nas linhas 6 e 7 informamos que a consulta terá como filtro o id da tabela produto ser o mesmo que na tabela venda_produto, realizando o vínculo entre elas.

Nas linhas 8 e 9 agrupamos o resultado por id do produto.

Já nas linhas 10 e 11 ordenamos essa consulta pelo valor TOTAL, de forma decrescente, ou seja, do maior valor para o menor.

E por fim, na linha 12 limitamos o retorno da consulta a três registros, começando do 0.

O resultado pode ser visto na Tabela 7.


Nome TOTAL
Notebook 7000.00
Monitor LG 19 450.00
Patinete 240.00
Tabela 7. Tabela venda_produto

No exemplo acima utilizamos a função agregadora SUM, a cláusula GROUP BY e ORDER BY.

Saiba mais Veja a Série SQL nível Jedi: Subqueries