Limitação de linhas / paginação (LIMIT/OFFSET, FETCH, ROWNUM, TOP)
Oracle
-- 12c+ standard: OFFSET/FETCH
SELECT name, salary FROM employee
ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- Older versions: with ROWNUM
SELECT * FROM (
SELECT name, salary FROM employee ORDER BY salary DESC
) WHERE ROWNUM <= 10;Usado para limitar/paginar um conjunto de resultados. Desde o Oracle 12c, o padrão OFFSET n ROWS FETCH NEXT m ROWS ONLY é suportado. Antes disso, usava-se a pseudocoluna ROWNUM; como o ROWNUM é atribuído antes da ordenação, é obrigatório envolver uma subconsulta com ORDER BY.
PostgreSQL
-- LIMIT/OFFSET
SELECT name, salary FROM employee
ORDER BY salary DESC
LIMIT 10 OFFSET 20;
-- Standard equivalent: FETCH
SELECT name, salary FROM employee
ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;O PostgreSQL suporta tanto LIMIT n OFFSET m quanto a forma padrão OFFSET ... FETCH. Valores grandes de OFFSET são lentos; para paginação profunda, a paginação baseada em chave (keyset / 'WHERE id > last_id') é mais eficiente. LIMIT sem ORDER BY não garante a ordem do resultado.
MySQL
-- LIMIT [offset,] row_count
SELECT name, salary FROM employee
ORDER BY salary DESC
LIMIT 10 OFFSET 20;
-- Short form: LIMIT offset, row_count
SELECT name, salary FROM employee ORDER BY salary DESC LIMIT 20, 10;O MySQL/MariaDB usam a palavra-chave LIMIT de duas formas: LIMIT row_count OFFSET offset ou LIMIT offset, row_count. O MySQL 8.0.19+ também aceita a sintaxe FETCH padrão. Recomenda-se a paginação keyset para o desempenho com OFFSET profundo.
SQL Server
-- First N with TOP
SELECT TOP 10 name, salary FROM employee ORDER BY salary DESC;
-- OFFSET/FETCH for paging (2012+), ORDER BY mandatory
SELECT name, salary FROM employee
ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;O SQL Server usa TOP n (com as variantes TOP (n) PERCENT / WITH TIES) para as N primeiras linhas e, desde 2012, OFFSET ... FETCH para paginação. ORDER BY é obrigatório para OFFSET/FETCH funcionar. O SQL Server não tem a palavra-chave LIMIT.
MongoDB
// Paging with skip/limit
db.employee.find()
.sort({ salary: -1 })
.skip(20)
.limit(10)No MongoDB, limit() define o número de documentos retornados e skip() o número de documentos pulados; combinados com sort(), fornecem paginação. Valores grandes de skip são caros; para paginação profunda, prefere-se uma consulta por intervalo (keyset) baseada no último valor visto.
Redis
# Range read on a sorted set (ZSET):
ZREVRANGE salary_sorted 20 29 # members ranked 21-30
# Range on a list:
LRANGE queue 0 9 # first 10 elementsO Redis não tem LIMIT do SQL, mas tem comandos de leitura por intervalo: ZRANGE/ZREVRANGE start stop (baseado em índice) ou ZRANGEBYSCORE ... LIMIT offset count para Sorted Sets; LRANGE para Lists. Esses comandos fornecem acesso semelhante a paginação.
Elasticsearch
GET employee/_search
{
"from": 20,
"size": 10,
"sort": [ { "salary": "desc" } ]
}No Elasticsearch, 'size' define o número de hits retornados e 'from' o número de hits pulados (o equivalente a LIMIT/OFFSET). from+size pode ser no máximo index.max_result_window (padrão 10.000); para paginação profunda, use 'search_after' (keyset) ou um PIT (point-in-time).