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.
SELECT columna... FROM table-name ORDER BY column-names OFFSET n ROWS
Sintaxis usando SQL OFFSET y FETCH.
Esto devuelve solo registros (n + 1) a (n + m). Vea el ejemplo a continuación.
SELECT columnas.. FROM tabla ORDER BY columna OFFSET n ROWS FETCH NEXT m 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.
SELECT id,Nombre,Sexo,Pais,cantidad FROM Cliente ORDER BY id OFFSET 5 ROWS
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.
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.
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.
SELECT id, Nombre, cantidad, Sexo, Pais FROM Cliente ORDER BY id OFFSET 2 ROWS FETCH NEXT 10-5 2 ROWS ONLY ;
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.
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.
SELECT nombre, apellido, salario FROM Empleado ORDER BY Salario OFFSET (SELECT COUNT(*) FROM EMPLEADO) - 2 ROWS FETCH NEXT 2 ROWS;
Puntos importantes:
- La cláusula SQL OFFSET NO es obligatoria con FETCH. Nunca puede usar, ORDENAR POR… FETCH.
- La Cláusula TOP no se puede combinar con OFFSET y FETCH.
- 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.
- ORDER BY es obligatorio para ser utilizado con la cláusula OFFSET y FETCH.
- El valor de OFFSET debe ser mayor o igual a cero. No puede ser negativo, de lo contrario devolverá error
- 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.
- Las cláusulas OFFSET y FETCH son compatibles con ANSI y se agregaron a SQL Server 2012.