LIMIT es la cláusula de SQL que dice «dame como mucho N filas». Sencilla, e increíblemente útil.
Imagina una tabla con 50 000 vídeos. Cuando abres YouTube, no ves los 50 000 — la página de inicio te muestra 12-20 recomendaciones. Eso es LIMIT. Lo mismo vale para la paginación del comercio electrónico, las tablas de clasificación de los juegos, las páginas de un feed social, las vistas previas de un panel de administración.
Por qué importa LIMIT
Tres escenarios clásicos:
- Top-N: top 10 de ventas de la semana, top 3 de publicaciones por me gusta.
- Paginación: «página 2 de 100», 20 productos por página.
- Vista previa / comprobación rápida: mientras depuras, quieres echar un vistazo a las primeras 5 filas para ver qué pinta tienen los datos.
Sin LIMIT, la consulta devuelve todo. En tablas grandes eso significa:
- Lento — millones de filas por la red.
- Inútil — el usuario no va a ver tantas de todos modos.
- Arriesgado — tu aplicación puede quedarse sin memoria.
Sintaxis básica
SELECT *
FROM table_name
LIMIT N;
Ejemplo: una tabla videos de un servicio de streaming.
SELECT title, views
FROM videos
LIMIT 5;
Devuelve las primeras 5 filas. Cuáles 5 — sin ORDER BY, impredecible. La base de datos las elige «tal como están».
LIMIT casi siempre va con ORDER BY
Si quieres «el top 5 por visualizaciones», LIMIT sin ordenar te da 5 filas al azar. Tienes que dejar claro el orden:
SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 5;
Ahora es «los 5 vídeos más vistos». La base de datos ordena primero y luego trunca.
Regla práctica: LIMIT sin ORDER BY solo tiene sentido en tres casos — vista previa durante el desarrollo, elegir una fila aleatoria (ORDER BY RANDOM()), depuración. En todo lo demás — escribe ORDER BY.
Ejemplo: servicio de streaming
| id | title | author | views | likes |
|---|
| 1 | Learn SQL in 30 minutes | Code Academy | 250000 | 12000 |
| 2 | Cats compile code | Funny Devs | 1200000 | 95000 |
| 3 | JOINs explained simply | DB Guru | 80000 | 4500 |
| 4 | A coder's borscht recipe | Tech Cooks | 30000 | 1800 |
| 5 | 10 mistakes in SELECT | DB Guru | 150000 | 8900 |
| 6 | Top React hooks 2024 | Web Dev | 500000 | 25000 |
| 7 | A short history of Linux | OS Lessons | 90000 | 5500 |
Consulta: top 3 por visualizaciones.
SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 3;
Resultado:
| title | views |
|---|
| Cats compile code | 1200000 |
| Top React hooks 2024 | 500000 |
| Learn SQL in 30 min | 250000 |
Entran siete filas, salen tres. Las que tienen el views más alto.
OFFSET — saltarse las primeras N filas
La cláusula compañera de LIMIT es OFFSET. Salta N filas antes de empezar a devolver.
SELECT title, views
FROM videos
ORDER BY views DESC
LIMIT 3 OFFSET 3;
Se lee como: «ordena por views descendente, salta 3 filas, devuelve las 3 siguientes».
Resultado para nuestra tabla (posiciones 4-6 por visualizaciones):
| title | views |
|---|
| Learn SQL in 30 min | 250000 |
| 10 mistakes in SELECT | 150000 |
| A history of Linux | 90000 |
Eso es la paginación. Página 1 — LIMIT 3 OFFSET 0. Página 2 — LIMIT 3 OFFSET 3. Página 3 — LIMIT 3 OFFSET 6.
La fórmula de la paginación:
LIMIT page_size OFFSET (page_number - 1) * page_size
PostgreSQL frente a MySQL — casi idénticos
Ambos entienden LIMIT N y LIMIT N OFFSET M. Diferencias rápidas:
- MySQL también admite una forma abreviada
LIMIT M, N — salta M, devuelve N. Se considera heredada; usa LIMIT N OFFSET M en su lugar.
- PostgreSQL también habla la forma estándar de SQL:
FETCH FIRST 10 ROWS ONLY (en lugar de LIMIT 10) y OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY. Verbosa, pero forma parte de SQL:2008. En la práctica todo el mundo escribe simplemente LIMIT/OFFSET.
Para principiantes: recuerda LIMIT N OFFSET M — funciona en ambos.
Ejemplo más grande: paginación de comercio electrónico
Tabla products:
| id | name | category | price | popularity |
|---|
| 1 | iPhone 15 | Electronics | 999 | 980 |
| 2 | Bosch kettle | Appliances | 49 | 320 |
| 3 | Book "Clean Code" | Books | 22 | 850 |
| 4 | DeLonghi coffee maker | Appliances | 380 | 410 |
| 5 | MacBook Air | Electronics | 1450 | 920 |
| 6 | Book "SQL in a Month" | Books | 17 | 670 |
| 7 | Pixel 8 | Electronics | 830 | 740 |
| 8 | LG fridge | Appliances | 720 | 280 |
| 9 | Slow cooker | Appliances | 89 | 560 |
| 10 | Book "JavaScript" | Books | 20 | 510 |
Objetivo: mostrar la página 2 (4 productos por página), ordenados por popularidad.
SELECT id, name, popularity
FROM products
ORDER BY popularity DESC
LIMIT 4 OFFSET 4;
Resultado:
| id | name | popularity |
|---|
| 7 | Pixel 8 | 740 |
| 6 | Book "SQL in a Month" | 670 |
| 9 | Slow cooker | 560 |
| 10 | Book "JavaScript" | 510 |
Página 1 (los más populares): iPhone 15, MacBook Air, Book "Clean Code", Pixel 8. Página 2: las filas 5-8 por popularidad. La página 3 sería OFFSET 8.
Muestreo aleatorio
Combinación para una fila aleatoria (útil para retos diarios, función del día, etc.):
SELECT * FROM products ORDER BY RANDOM() LIMIT 1;
SELECT * FROM products ORDER BY RAND() LIMIT 1;
Aviso: en tablas grandes RANDOM() / RAND() es pesado — la base de datos tiene que generar un número aleatorio por fila y ordenar. Está bien para tablas pequeñas, doloroso para millones de filas. Para esas, usa otros trucos (p. ej., WHERE id = ROUND(RANDOM() * (SELECT MAX(id) FROM products))).
Errores habituales de principiante
1. LIMIT sin ORDER BY, esperando un orden. La gente da por hecho que «la base de datos devuelve en orden de inserción». No lo hace. ¿Necesitas un orden? Escribe ORDER BY.
2. Paginación sin ORDER BY. El error más traicionero. Sin ordenar, la página 2 puede contener filas de la página 1, y el usuario ve duplicados. Ordena siempre por una columna única (normalmente id).
3. OFFSET enormes. OFFSET 1000000 obliga a la base de datos a generar un millón de filas y luego tirarlas. Lento. Para tablas grandes prefiere la paginación por clave (keyset): WHERE id > last_seen_id LIMIT N.
4. LIMIT con UNION. Si quieres que LIMIT se aplique a todo el UNION, ponlo entre paréntesis o coloca ORDER BY/LIMIT al final del todo:
(SELECT name FROM authors UNION SELECT name FROM editors)
ORDER BY name
LIMIT 10;
5. LIMIT negativo o LIMIT 0. LIMIT 0 es válido — devuelve 0 filas (a veces útil para comprobar una consulta sin traer datos). Los números negativos lanzan un error.
6. LIMIT en UPDATE/DELETE — depende de la base de datos. MySQL permite UPDATE … LIMIT 100. PostgreSQL no — tienes que usar una subconsulta o un CTE.
Resumen rápido
LIMIT N — devuelve como mucho N filas.
OFFSET M — salta M filas antes de empezar.
- Casi siempre acompañado de
ORDER BY — de lo contrario el orden es impredecible.
- Se usa para top-N, paginación, vistas previas.
- La misma sintaxis en PostgreSQL y MySQL.
- Los OFFSET enormes son lentos — prefiere la paginación por clave en tablas grandes.
Pruébalo tú
Sobre la tabla videos:
- Obtén los 5 vídeos con más me gusta.
- Obtén la página 2 (3 vídeos por página), ordenados por visualizaciones descendentes.
- Elige un vídeo aleatorio para «el vídeo del día».
Escribe las consultas por tu cuenta. Una vez que te manejes con la combinación ORDER BY + LIMIT, la mitad de todas las consultas de lectura del mundo real se reducen a este patrón.
LIMITes la cláusula de SQL que dice «dame como mucho N filas». Sencilla, e increíblemente útil.Imagina una tabla con 50 000 vídeos. Cuando abres YouTube, no ves los 50 000 — la página de inicio te muestra 12-20 recomendaciones. Eso es
LIMIT. Lo mismo vale para la paginación del comercio electrónico, las tablas de clasificación de los juegos, las páginas de un feed social, las vistas previas de un panel de administración.Por qué importa LIMIT
Tres escenarios clásicos:
Sin
LIMIT, la consulta devuelve todo. En tablas grandes eso significa:Sintaxis básica
SELECT * FROM table_name LIMIT N;Ejemplo: una tabla
videosde un servicio de streaming.SELECT title, views FROM videos LIMIT 5;Devuelve las primeras 5 filas. Cuáles 5 — sin
ORDER BY, impredecible. La base de datos las elige «tal como están».LIMIT casi siempre va con ORDER BY
Si quieres «el top 5 por visualizaciones»,
LIMITsin ordenar te da 5 filas al azar. Tienes que dejar claro el orden:SELECT title, views FROM videos ORDER BY views DESC LIMIT 5;Ahora es «los 5 vídeos más vistos». La base de datos ordena primero y luego trunca.
Regla práctica:
LIMITsinORDER BYsolo tiene sentido en tres casos — vista previa durante el desarrollo, elegir una fila aleatoria (ORDER BY RANDOM()), depuración. En todo lo demás — escribeORDER BY.Ejemplo: servicio de streaming
Consulta: top 3 por visualizaciones.
SELECT title, views FROM videos ORDER BY views DESC LIMIT 3;Resultado:
Entran siete filas, salen tres. Las que tienen el
viewsmás alto.OFFSET — saltarse las primeras N filas
La cláusula compañera de
LIMITesOFFSET. Salta N filas antes de empezar a devolver.SELECT title, views FROM videos ORDER BY views DESC LIMIT 3 OFFSET 3;Se lee como: «ordena por
viewsdescendente, salta 3 filas, devuelve las 3 siguientes».Resultado para nuestra tabla (posiciones 4-6 por visualizaciones):
Eso es la paginación. Página 1 —
LIMIT 3 OFFSET 0. Página 2 —LIMIT 3 OFFSET 3. Página 3 —LIMIT 3 OFFSET 6.La fórmula de la paginación:
LIMIT page_size OFFSET (page_number - 1) * page_sizePostgreSQL frente a MySQL — casi idénticos
Ambos entienden
LIMIT NyLIMIT N OFFSET M. Diferencias rápidas:LIMIT M, N— salta M, devuelve N. Se considera heredada; usaLIMIT N OFFSET Men su lugar.FETCH FIRST 10 ROWS ONLY(en lugar deLIMIT 10) yOFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY. Verbosa, pero forma parte de SQL:2008. En la práctica todo el mundo escribe simplementeLIMIT/OFFSET.Para principiantes: recuerda
LIMIT N OFFSET M— funciona en ambos.Ejemplo más grande: paginación de comercio electrónico
Tabla
products:Objetivo: mostrar la página 2 (4 productos por página), ordenados por popularidad.
SELECT id, name, popularity FROM products ORDER BY popularity DESC LIMIT 4 OFFSET 4;Resultado:
Página 1 (los más populares): iPhone 15, MacBook Air, Book "Clean Code", Pixel 8. Página 2: las filas 5-8 por popularidad. La página 3 sería
OFFSET 8.Muestreo aleatorio
Combinación para una fila aleatoria (útil para retos diarios, función del día, etc.):
-- PostgreSQL SELECT * FROM products ORDER BY RANDOM() LIMIT 1; -- MySQL SELECT * FROM products ORDER BY RAND() LIMIT 1;Aviso: en tablas grandes
RANDOM()/RAND()es pesado — la base de datos tiene que generar un número aleatorio por fila y ordenar. Está bien para tablas pequeñas, doloroso para millones de filas. Para esas, usa otros trucos (p. ej.,WHERE id = ROUND(RANDOM() * (SELECT MAX(id) FROM products))).Errores habituales de principiante
1. LIMIT sin ORDER BY, esperando un orden. La gente da por hecho que «la base de datos devuelve en orden de inserción». No lo hace. ¿Necesitas un orden? Escribe
ORDER BY.2. Paginación sin ORDER BY. El error más traicionero. Sin ordenar, la página 2 puede contener filas de la página 1, y el usuario ve duplicados. Ordena siempre por una columna única (normalmente
id).3. OFFSET enormes.
OFFSET 1000000obliga a la base de datos a generar un millón de filas y luego tirarlas. Lento. Para tablas grandes prefiere la paginación por clave (keyset):WHERE id > last_seen_id LIMIT N.4. LIMIT con UNION. Si quieres que
LIMITse aplique a todo el UNION, ponlo entre paréntesis o coloca ORDER BY/LIMIT al final del todo:(SELECT name FROM authors UNION SELECT name FROM editors) ORDER BY name LIMIT 10;5. LIMIT negativo o LIMIT 0.
LIMIT 0es válido — devuelve 0 filas (a veces útil para comprobar una consulta sin traer datos). Los números negativos lanzan un error.6. LIMIT en UPDATE/DELETE — depende de la base de datos. MySQL permite
UPDATE … LIMIT 100. PostgreSQL no — tienes que usar una subconsulta o un CTE.Resumen rápido
LIMIT N— devuelve como mucho N filas.OFFSET M— salta M filas antes de empezar.ORDER BY— de lo contrario el orden es impredecible.Pruébalo tú
Sobre la tabla
videos:Escribe las consultas por tu cuenta. Una vez que te manejes con la combinación
ORDER BY + LIMIT, la mitad de todas las consultas de lectura del mundo real se reducen a este patrón.