SQL: Paginando resultados com limit e offset

Tanto o MySQL quanto o Postgresql suportam um recurso muito útil para paginação de resultados, chamado de OFFSET, normalmente utilizado com LIMIT.

Neste post, veremos como utilizar o LIMIT e o OFFSET para paginar resultados de uma SQL.

A cláusula LIMIT é utilizada para limitar o número de resultados de uma SQL. Então, se sua SQL retornar 1000 linhas, mas você quer apenas as 10 primeiras, você deve executar uma instrução mais ou menos assim:

SELECT coluna FROM tabela LIMIT 10;

Agora, vamos supor que você quer somente os resultados de 11 a 20. Com a instrução OFFSET fica fácil, basta proceder da seguinte forma:

SELECT coluna FROM tabela LIMIT 10 OFFSET 10;

O comando OFFSET indica o início da leitura, e o LIMIT o máximo de registros a serem lidos. Para os registros de 61 a 75, por exemplo:

SELECT coluna FROM tabela LIMIT 15 OFFSET 60;

Com este recurso, fica fácil paginar os resultados de uma SQL e mostrar ao usuário apenas a página, ao invés de retornar todos os registros da tabela. Uma tabela com 2000 registros, por exemplo, fica muito melhor mostrar ao usuário de 10 em 10, por exemplo, e diminui a carga no banco de dados, melhorando a sua performance.

Referência:

http://www.petefreitag.com/item/451.cfm

Espero ter ajudado.

Abraço!

Deixe um Comentário

9 Comentários.

  1. show, so tive um pouco de dificuldade de calcular o offset, mas deu certo

  2. Valeu, muito prático!

  3. Explicação rápida e prática. Parabéns ao autor.

  4. Agora, vamos supor que você quer (somente os resultados de 11 a 20)…

    O comando OFFSET indica o início da leitura, e o LIMIT o máximo de registros a serem lidos. Para os registros (de 60 a 75)…

    porque no exemplo de cima o 10 não é incluido mas no outro o 60 é?

    • Anderson, você está certo. O comando “limit 15 offset 60” mostra os resultados de 61 a 75 (e não de 60 a 75).

      Vou fazer a edição do post.

      Obrigado!

  5. Hallan obrigado ajudou muito.

  6. Cassio de Vargas Oliveira

    Uma dúvida, se eu pegar o limit com group by, ele vai pegar os registros especificados pelo limit, mas analizara todos os registros da fatia determinada pelo where né?
    “select marca, count(*) nas total from tabela group by marca limit 10”,
    No caso de haver mais de 10 marcas, o banco vai procurar em todos os registros se tem mais marcas para agregar a coluna total, correto?

    Obrigado

  7. Muito bom, obrigado

  8. Obrigado amigo, simplesmente fantástico 😀

Deixe um Comentário


NOTA - Você pode usar estesHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>