OFFSET en SQL: qué es, cómo funciona y ejemplos prácticos

La cláusula OFFSET en SQL se utiliza para saltar un número específico de filas antes de comenzar a devolver los resultados de una consulta.
Generalmente se combina con LIMIT (o su equivalente FETCH) para implementar paginación de datos en aplicaciones.

👉 Con OFFSET podemos decirle a la base de datos: “traeme 10 resultados, pero empezando desde la fila 21”.

Sintaxis básica de OFFSET

En motores como PostgreSQL, MySQL (8+) y SQLite, la sintaxis es:

SELECT columnas
FROM tabla
[WHERE condición]
[ORDER BY columna]
LIMIT n OFFSET m;
  • n: cantidad de filas a devolver.
  • m: cantidad de filas a saltar antes de empezar a devolver resultados.

Ejemplo básico de OFFSET

Supongamos la tabla productos:

idnombreprecio
1Teclado25
2Monitor180
3Notebook750
4Mouse20
5Impresora120
6Auriculares60

Consulta:

SELECT * FROM productos
ORDER BY precio ASC
LIMIT 3 OFFSET 2;

Resultado:

idnombreprecio
5Impresora120
2Monitor180
3Notebook750

👉 Se saltean los 2 más baratos (Mouse y Teclado) y se devuelven los 3 siguientes.

OFFSET en la paginación de resultados

OFFSET es ideal para paginar.
Si queremos mostrar resultados de a 10 filas:

  • Página 1 → LIMIT 10 OFFSET 0
  • Página 2 → LIMIT 10 OFFSET 10
  • Página 3 → LIMIT 10 OFFSET 20

Ejemplo:

SELECT * FROM pedidos
ORDER BY fecha DESC
LIMIT 10 OFFSET 20;

👉 Devuelve la tercera página de pedidos (del 21 al 30 más recientes).

OFFSET sin LIMIT

Algunos motores permiten usar OFFSET solo:

SELECT * FROM clientes
OFFSET 5;

👉 Devuelve todos los registros a partir del sexto.

⚠️ No todos los SGBD soportan esta sintaxis (MySQL, por ejemplo, requiere LIMIT).

OFFSET con FETCH (SQL estándar)

En SQL estándar y en motores como Oracle, SQL Server y PostgreSQL, se recomienda usar OFFSET ... FETCH:

SELECT columnas
FROM tabla
ORDER BY columna
OFFSET m ROWS
FETCH NEXT n ROWS ONLY;

Ejemplo:

SELECT * FROM empleados
ORDER BY salario DESC
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;

👉 Salta los 10 empleados mejor pagos y devuelve los siguientes 5.

Ejemplo avanzado: clientes por lote

Queremos enviar correos en lotes de 50 clientes:

SELECT id, nombre, email
FROM clientes
ORDER BY id ASC
LIMIT 50 OFFSET 100;

👉 Devuelve los clientes del 101 al 150.

OFFSET y rendimiento en tablas grandes

Aunque OFFSET es muy práctico, puede ser ineficiente en tablas grandes:

  • La base de datos sigue leyendo todas las filas hasta llegar al OFFSET.
  • Ejemplo: OFFSET 100000 implica procesar 100.000 filas antes de devolver resultados.

Solución: paginación por clave con PRIMARY KEY e índices:

En lugar de usar OFFSET, se recomienda filtrar por la clave primaria:

SELECT * FROM productos
WHERE id > 1000
ORDER BY id ASC
LIMIT 50;

👉 Mucho más rápido en grandes volúmenes.

OFFSET en distintos motores de base de datos

  • PostgreSQL → soporta LIMIT ... OFFSET y OFFSET ... FETCH.
  • MySQL / MariaDB → soportan LIMIT n OFFSET m.
  • SQLite → soporta LIMIT n OFFSET m.
  • Oracle → desde la versión 12c soporta OFFSET ... FETCH.
  • SQL Server → desde 2012 soporta OFFSET ... FETCH. Antes se usaba ROW_NUMBER().

Diferencias: OFFSET vs TOP vs ROWNUM

  • OFFSET + LIMIT (PostgreSQL, MySQL, SQLite).
  • TOP n (SQL Server).
  • ROWNUM (Oracle versiones antiguas).
  • FETCH FIRST n ROWS ONLY (SQL estándar).

👉 Todos cumplen el mismo propósito: limitar y/o paginar resultados.

Errores comunes con OFFSET

  1. Usar OFFSET sin ORDER BY
SELECT * FROM empleados LIMIT 10 OFFSET 20;

👉 El resultado puede ser inconsistente si no hay un orden definido.

  1. OFFSET muy grande en tablas enormes
    👉 Puede ser lento porque la base de datos sigue recorriendo filas antes de devolver.
  2. Asumir que OFFSET es universal
    👉 En SQL Server u Oracle antiguo no existe como tal.
  3. Olvidar que OFFSET empieza en 0
  • OFFSET 0 = desde el primer registro.
  • OFFSET 10 = salta los primeros 10.

Buenas prácticas con OFFSET

  • Siempre usar ORDER BY junto con OFFSET para resultados consistentes.
  • Evitar valores muy grandes de OFFSET en tablas grandes → usar paginación por clave.
  • Usar FETCH NEXT si el motor soporta SQL estándar.
  • Probar la consulta con distintos valores de OFFSET para verificar que los resultados no se repiten ni se omiten.

Ejemplo real: artículos de un blog

SELECT titulo, fecha
FROM articulos
ORDER BY fecha DESC
LIMIT 10 OFFSET 30;

👉 Devuelve la cuarta página de artículos (del 31 al 40 más recientes).

Preguntas frecuentes (FAQ)

1. ¿OFFSET empieza en 0 o en 1?
En SQL, OFFSET 0 significa empezar desde la primera fila.

2. ¿Qué pasa si OFFSET es mayor al número de filas disponibles?
La consulta devuelve 0 filas.

3. ¿OFFSET es parte del estándar SQL?
Sí, pero la forma recomendada es OFFSET ... FETCH.

4. ¿OFFSET afecta el rendimiento?
Sí, especialmente en tablas muy grandes con valores altos.

5. ¿Puedo usar OFFSET sin LIMIT?
Depende del motor: PostgreSQL lo permite, MySQL no.

Conclusión

La cláusula OFFSET en SQL es clave para implementar paginación y control sobre los resultados.

  • Permite saltar filas antes de mostrar resultados.
  • Se usa junto a LIMIT o FETCH NEXT.
  • Puede ser ineficiente con valores grandes, por lo que conviene usar paginación basada en claves para tablas masivas.

Dominar OFFSET es fundamental para construir aplicaciones web, reportes y consultas eficientes en bases de datos.

Aprende paginación junto con LIMIT en ORDER BY y LIMIT y consulta el Glosario SQL completo.

Scroll al inicio