Las clausulas TOP y OFFSET-FETCH, permiten limitar el numero de filas devueltas por una consulta.
A menudo, cuando hacemos una consulta, no queremos obtener todos los registros que cumplen una condición.
Imagina que quieres saber “¿Quiénes son los 3 empleados que más han vendido este mes?” o estás programando una página web y necesitas mostrar los resultados de la “Página 2” (del registro 11 al 20).
Para estos escenarios, T-SQL nos ofrece dos herramientas, TOP y la moderna y estándar OFFSET-FETCH.
¿Cuál uso?
| Característica | TOP | OFFSET-FETCH |
|---|---|---|
| Uso Principal | ”Los N mejores”, muestreo rápido, subconsultas. | Paginación de aplicaciones web. |
| Estándar SQL | No (Propietario de Microsoft). | Sí (ANSI SQL). |
| Requiere ORDER BY | No (pero recomendable). | Sí (Obligatorio). |
| Soporta Empates | Sí (WITH TIES). | No. |
| Soporta Porcentaje | Sí (PERCENT). | No. |
- Usa TOP cuando quieras analizar extremos (precios más altos, últimas fechas) o necesites gestionar empates.
- Usa OFFSET-FETCH cuando estés construyendo una API o una web que necesite botones de “Siguiente página”.
La cláusula TOP
TOP es la forma tradicional de SQL Server para limitar resultados. Es muy sencilla: le dices cuántas filas quieres y él se detiene en cuanto llega a ese número.
TOP con un número fijo
Es el uso más habitual. “Dame los 5 primeros”.
SELECT TOP (5) Nombre, Precio
FROM Productos
ORDER BY Precio DESC;
Importante: TOP y ORDER BY deben ir siempre de la mano. Si usas TOP sin un ORDER BY, SQL Server te devolverá 5 filas “aleatorias” (basadas en cómo están físicamente en el disco o en caché), lo cual hace que tu consulta sea no determinista.
TOP con porcentaje (PERCENT)
En lugar de un número fijo, podemos pedir una proporción de los datos.
-- Obtener el 10% de los empleados con peores ventas
SELECT TOP (10) PERCENT Nombre, Ventas
FROM Empleados
ORDER BY Ventas ASC;
Si la tabla tiene 100 filas, devolverá 10. Si tiene 105, devolverá 11 (siempre redondea hacia arriba para cumplir el porcentaje).
Paginación con OFFSET-FETCH
TOP es genial, pero tiene un problema: solo sabe coger datos desde el principio. No tiene una forma nativa fácil de decir “áltate los primeros 10 y dame los siguientes 10”.
Históricamente, hacer paginación en SQL Server era un dolor de cabeza (usando funciones como ROW_NUMBER). Afortunadamente, desde SQL Server 2012 tenemos OFFSET-FETCH.
Esta sintaxis es parte del estándar ANSI SQL (lo que significa que es similar en Oracle o PostgreSQL) y está diseñada específicamente para paginar resultados.
Sintaxis
Funciona como una extensión de la cláusula ORDER BY.
SELECT Columnas
FROM Tabla
ORDER BY Columna
OFFSET X ROWS -- Cuántas filas me salto
FETCH NEXT Y ROWS ONLY -- Cuántas filas cojo
Ejemplo de Paginación
Imaginemos que mostramos 10 productos por página.
Página 1 (Primeros 10): Podríamos usar TOP, pero con OFFSET sería:
SELECT ProductoID, Nombre
FROM Productos
ORDER BY ProductoID
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;
OFFSET-FETCH requiere obligatoriamente la cláusula ORDER BY. No puedes paginar algo que no tiene orden.
Página 2 (Saltar 10, coger los siguientes 10):
SELECT ProductoID, Nombre
FROM Productos
ORDER BY ProductoID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
Página 3 (Saltar 20, coger 10):
SELECT ProductoID, Nombre
FROM Productos
ORDER BY ProductoID
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;
- Estándar: Es código portable.
- Claridad: El propósito del código es obvio (paginar).
- Flexible: Puedes usar solo
OFFSETsinFETCH(para decir “dame todos menos los 5 primeros”), aunque es raro usarlo así.
