DBAtlas · Atlas de operaciones de bases de datos

Limitación de filas / paginación (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;

Se usa para limitar/paginar un conjunto de resultados. Desde Oracle 12c se admite el estándar OFFSET n ROWS FETCH NEXT m ROWS ONLY. Antes se usaba la pseudocolumna ROWNUM; como ROWNUM se asigna antes de ordenar, es obligatorio envolver una subconsulta con 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;

PostgreSQL admite tanto LIMIT n OFFSET m como la forma estándar OFFSET ... FETCH. Los valores grandes de OFFSET son lentos; para paginación profunda, la paginación basada en claves (keyset / 'WHERE id > last_id') es más eficiente. LIMIT sin ORDER BY no garantiza el orden del 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;

MySQL/MariaDB usan la palabra clave LIMIT en dos formas: LIMIT row_count OFFSET offset o LIMIT offset, row_count. MySQL 8.0.19+ también acepta la sintaxis FETCH estándar. Se recomienda la paginación keyset para el rendimiento con OFFSET profundos.

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;

SQL Server usa TOP n (con las variantes TOP (n) PERCENT / WITH TIES) para las primeras N filas y, desde 2012, OFFSET ... FETCH para la paginación. ORDER BY es obligatorio para que OFFSET/FETCH funcione. SQL Server no tiene la palabra clave LIMIT.

MongoDB

// Paging with skip/limit
db.employee.find()
  .sort({ salary: -1 })
  .skip(20)
  .limit(10)

En MongoDB, limit() establece el número de documentos devueltos y skip() el número omitido; combinados con sort() proporcionan paginación. Los valores grandes de skip son costosos; para paginación profunda se prefiere una consulta por rango (keyset) basada en el ú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 elements

Redis no tiene LIMIT de SQL, pero tiene comandos de lectura por rango: ZRANGE/ZREVRANGE start stop (por índice) o ZRANGEBYSCORE ... LIMIT offset count para Sorted Sets; LRANGE para Lists. Estos comandos proporcionan un acceso similar a la paginación.

Elasticsearch

GET employee/_search
{
  "from": 20,
  "size": 10,
  "sort": [ { "salary": "desc" } ]
}

En Elasticsearch, 'size' establece el número de hits devueltos y 'from' el número omitido (el equivalente de LIMIT/OFFSET). from+size puede ser como máximo index.max_result_window (por defecto 10,000); para paginación profunda use 'search_after' (keyset) o un PIT (point-in-time).

Abrir en DBAtlas →