SQL OFFSET: Limite el Número de filas

La cláusula SQL OFFSET se utiliza para especificar un número N de resultados de la consulta inicial que deben omitirse (no devolverse a la aplicación). N se calcula mediante una expresión que puede ser un único literal entero, o una única variable externa, o cualquier expresión que se cree a partir de literales y variables externas y devuelva un único entero no negativo.

Sintaxis usando la cláusula SQL OFFSET:

A continuación se muestra la sintaxis de la cláusula OFFSET:

La sintaxis de la clausula SQL OFFISET  sin FETCH.

Ejemplo de SELECT con ORDER BY y OFFSET en SQL Server


SELECT columna1, columna2
FROM NombreTabla
ORDER BY columna1
OFFSET 5 ROWS;

Sintaxis usando SQL OFFSET y FETCH.

Esto devuelve solo registros (n + 1) a (n + m). Vea el ejemplo a continuación.

Ejemplo de SELECT con ORDER BY, OFFSET y FETCH NEXT en SQL Server


SELECT columna1, columna2
FROM MiTabla
ORDER BY columna1
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY;

Nota:

  • La clausula SQL server OFFSET solo se puede usar con la cláusula ORDER BY. No se puede usar solo.
  • El valor de OFFSET debe ser mayor o igual a cero. No puede ser negativo, de lo contrario devolverá error.
  • SQL OFFSET excluye el primer conjunto de filas en un conjunto de resultados. OFFSET con FETCH NEXT devuelve una ventana definida de filas. OFFSET con FETCH NEXT es excelente para el soporte de paginación.
  • La cláusula SQL OFFSET es la cláusula obligatoria en la combinación y sigue a la cláusula ORDER BY.
  • La cláusula FETCH es opcional

Ejemplo de la cláusula SQL OFFSET sin  FETCH

Ahora aplicaremos el desplazamiento en la consulta para saltar 5 filas con la clausula SQL offiset.

Ejemplo de SELECT con ORDER BY y OFFSET en tabla Cliente


SELECT id, Nombre, Sexo, Pais, cantidad
FROM Cliente
ORDER BY id
OFFSET 5 ROWS;
sql offset

Ejemplo de la cláusula SQL OFFSET con FETCH

Podemos modificar la consulta anterior agregando la cláusula SQL FETCH como se muestra a continuación con un argumento 3 para indicar que solo se deben devolver las siguientes 3 filas después de las primeras 5 filas en el conjunto de resultados.

Ejemplo de SELECT con ORDER BY, OFFSET y FETCH NEXT en tabla Cliente


SELECT id, Nombre, Sexo, Pais, cantidad
FROM Cliente
ORDER BY id
OFFSET 5 ROWS
FETCH NEXT 3 ROWS ONLY;

El resultado será el siguiente, que es casi el mismo que el anterior, omitiendo las últimas 5 filas y mostrando solo 3 filas después del desplazamiento en el conjunto de resultados.

sql offset

También es posible especificar el número de filas para SQL OFFSET y FETCH como un cálculo matemático como se muestra a continuación. 

Ejemplo de SELECT con OFFSET y FETCH NEXT usando expresión en SQL Server


SELECT id, Nombre, cantidad, Sexo, Pais
FROM Cliente
ORDER BY id
OFFSET 2 ROWS
FETCH NEXT (10 - 5 + 2) ROWS ONLY;
sql offiset

La consulta anterior generará el siguiente resultado. Omite las primeras 2 filas (10-5=5) y devuelve las siguientes 5 filas del conjunto de resultados ORDER BY original anterior.
Problema : enumere los productos más caros del 10 al 15 ordenados por precio.

Ejemplo de SELECT con ORDER BY, OFFSET y FETCH NEXT en tabla Producto


SELECT Id, Productnombre, UnitPricio
FROM Producto
ORDER BY UnitPricio DESC
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY;

Imprime las 2 filas inferiores de la tabla Empleado cuando se ordena por Salario.

Ejemplo de SELECT para obtener los 2 empleados con mayor salario


SELECT nombre, apellido, salario
FROM Empleado
ORDER BY Salario
OFFSET (
    SELECT COUNT(*) FROM Empleado
) - 2 ROWS
FETCH NEXT 2 ROWS ONLY;

Puntos importantes:

  1. La cláusula SQL OFFSET  NO es obligatoria con FETCH. Nunca puede usar, ORDENAR POR… FETCH.
  2. La Cláusula TOP no se puede combinar con OFFSET y FETCH.
  3. La expresión de recuento de filas OFFSET/FETCH solo puede ser cualquier expresión aritmética, constante o de parámetro que devuelva un valor entero.
  4. ORDER BY es obligatorio para ser utilizado con la cláusula OFFSET y FETCH.
  5. El valor de OFFSET debe ser mayor o igual a cero. No puede ser negativo, de lo contrario devolverá error
  6. Aunque es posible usar offset sin una cláusula order-by, no tiene mucho sentido hacerlo. Esto se debe a que sin orden por, los resultados se devuelven en un orden aleatorio, por lo que el subconjunto de resultados omitidos será diferente cada vez que se ejecute la consulta. 
  7. Las cláusulas OFFSET y FETCH son compatibles con ANSI y se agregaron a SQL Server 2012.

Deja un comentario

📢 Comparte este contenido

Compartir en Facebook Compartir en Twitter Compartir en LinkedIn Compartir en WhatsApp Compartir en Pinterest Compartir en Reddit