CodeGym /Cursos /SQL SELF /Usando OFFSET pra pular linhas e montar paginação

Usando OFFSET pra pular linhas e montar paginação

SQL SELF
Nível 3 , Lição 1
Disponível

Deixa eu te perguntar: o que você faz quando encontra muitos produtos numa página de loja online? Isso aí, clica pra próxima página. Mas o que rola por trás dos panos? É a mágica do SQL — usando o comando OFFSET pra pular linhas. Hoje tu vai aprender o que é OFFSET, pra que serve, como usar e por que ele é a base da paginação de dados.

OFFSET é uma palavra-chave do SQL que deixa você pular uma quantidade definida de linhas no resultado da query. Tipo folhear um livro: dá pra "pular" as 10 primeiras linhas e começar a ver a partir da 11ª.

Sintaxe

SELECT coluna1, coluna2
FROM tabela
OFFSET quantidade_de_linhas;
  • OFFSET — palavra-chave pra pular linhas.
  • quantidade_de_linhas — quantas linhas você quer pular.

Exemplo simples de uso do OFFSET

Imagina que temos uma tabela students com esses dados:

id name age
1 Alysa 22
2 Bob 24
3 Klara 23
4 Dan 21
5 Eva 25

Queremos mostrar todos os estudantes a partir do terceiro. Pra isso, usamos essa query:

SELECT *
FROM students
OFFSET 2;

Resultado:

id name age
3 Klara 23
4 Dan 21
5 Eva 25

O SQL "pulou" as duas primeiras linhas (Alysa e Bob) e mostrou o resultado a partir da terceira. Tipo usar marcador de página: "essa página já li, bora pra próxima".

Combinando OFFSET com LIMIT

OFFSET normalmente é usado junto com LIMIT. Assim dá pra pular linhas e limitar o resultado ao número de registros que você quer. Isso é muito útil pra paginação (page = página) — mostrar dados em partes, algumas linhas por vez.

Imagina que queremos mostrar 2 registros por vez e começar do terceiro. A query fica assim:

SELECT *
FROM students
LIMIT 2 
OFFSET 2;

Resultado:

id name age
3 Klara 23
4 Dan 21

Lógica do rolê:

  1. OFFSET 2 pula as duas primeiras linhas: Alysa e Bob.
  2. LIMIT 2 pega só duas linhas das que sobraram.

Montando paginação

Agora vem a parte mais massa — montar a paginação. Imagina que você tá fazendo um app web com lista de estudantes. Em cada página você quer mostrar 2 registros. Como faz?

A lógica é:

  • Primeira página não pula nada: OFFSET 0.
  • Segunda página pula 2 linhas: OFFSET 2.
  • Terceira página pula 4 linhas: OFFSET 4.
  • E assim vai...

Exemplo: mostra a segunda página

Na primeira página aparecem os registros 1 e 2 (Alysa e Bob). Na segunda — registros 3 e 4 (Klara e Dan).

SELECT *
FROM students
ORDER BY id
LIMIT 2 
OFFSET 2;

Resultado:

id name age
3 Klara 23
4 Dan 21

Exemplo: mostra a terceira página

Na terceira página — registros 5 e 6 (se existirem).

SELECT *
FROM students
ORDER BY id
LIMIT 2 
OFFSET 4;

Resultado:

id name age
5 Eva 25

Fórmula pra calcular o OFFSET

Pra automatizar a paginação, usa essa fórmula:

OFFSET = (numero_da_pagina - 1) * quantidade_de_registros_por_pagina

Por exemplo:

  • Pra primeira página: (1 - 1) * 2 = 0.
  • Pra segunda página: (2 - 1) * 2 = 2.
  • Pra terceira página: (3 - 1) * 2 = 4.

Dicas importantes de performance

Quando você mexe com tabelas grandes, usar OFFSET pode ficar lento, principalmente nas páginas mais pra frente. Isso porque o PostgreSQL ainda lê todas as linhas que foram puladas. Por exemplo, uma query com OFFSET 10000 faz o banco passar pelas 10.000 primeiras linhas antes de mostrar o resultado. Nesses casos, vale pensar em alternativas, tipo usar um identificador único como marcador de paginação.

Alternativa: paginação usando cursor

Pra otimizar, dá pra usar o esquema de "cursor". Em vez de pular linhas com OFFSET, você guarda o id da última linha mostrada na página anterior e usa ele pra montar a próxima query:

SELECT *
FROM students
WHERE id > ultimo_id_mostrado
ORDER BY id
LIMIT 2;

Esse jeito pode deixar a consulta bem mais rápida em tabelas grandes.

Paginação na prática

Paginação é usada na maioria dos apps web: lojas online, blogs, painéis de admin. Por exemplo:

  • Mostrar lista de produtos numa loja online;
  • Exibir lista de usuários num sistema CRM;
  • Mostrar feed de notícias por páginas.

Também pode ser útil quando você tá analisando muitos dados, pra trabalhar com pedaços menores.

Erros comuns usando OFFSET

Usar OFFSET às vezes confunde, principalmente pra quem tá começando. Olha só os erros mais comuns:

Faltou ordenar. Se você não colocar ORDER BY, a ordem das linhas no resultado do OFFSET pode ser aleatória.

Query errada:

SELECT * FROM students
OFFSET 5;

Query certa:

SELECT * FROM students
ORDER BY id
OFFSET 5;

Valor errado de OFFSET. Se colocar um valor muito alto, o resultado vai ser vazio.

Problemas de performance. Como já falamos, usar OFFSET grande nas páginas finais pode ser bem lento.

Faltou filtro. Se você usar OFFSET e LIMIT sem filtrar (WHERE), pode acabar pegando dados desnecessários, o que piora a performance.

Ordem dos operadores. A ordem dos operadores no SQL é fixa: primeiro LIMIT, depois OFFSET. Pode omitir algum, mas não pode trocar a ordem.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION