🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

[SQL] ¡Domina la cláusula LIMIT! Control total de los resultados: desde lo básico hasta la paginación

“Top 5 de nuevos productos”, “Top 10 de artículos populares”, “Primera página de resultados de búsqueda”… En sitios web y aplicaciones, es muy común mostrar solo una parte de un gran conjunto de datos. La cláusula poderosa de SQL que permite esto es LIMIT.

Este artículo está dirigido a creadores web y explica todo desde el uso básico de LIMIT hasta cómo implementar la técnica esencial de paginación en el desarrollo web. Incluye muchos ejemplos de código y un entorno de ejecución interactivo que puedes copiar y pegar. ¡Ponlo en práctica y adquiere esta poderosa herramienta para manipular datos con inteligencia!


¡A calentar motores! Usaremos datos de ejemplo nuevamente

Antes de empezar, volveremos a utilizar la tabla de productos (products) de la tienda en línea ficticia "Web Creator's Mart". Si ya leíste nuestro artículo sobre ORDER BY, probablemente te resulte familiar.

El siguiente SQL crea la tabla e inserta datos. Puedes probarlo en tu propio entorno o usarlo más adelante en el “entorno de ejecución interactivo”. Échale un vistazo antes de continuar.

-- Crear tabla de productos

CREATE TABLE products (

  id INT,

  name VARCHAR(255),

  category VARCHAR(255),

  price INT,

  release_date DATE

);



-- Insertar datos de ejemplo (7 filas)

INSERT INTO products (id, name, category, price, release_date) VALUES

(1, 'Cojín esponjoso', 'Interior', 3200, '2023-04-15'),

(2, 'Auriculares anti ruido', 'Gadget', 7800, '2023-11-01'),

(3, 'Cuaderno creativo', 'Papelería', 1200, '2022-08-20'),

(4, 'Teclado iluminado', 'Gadget', 15000, '2023-06-30'),

(5, 'Silla ultra cómoda', 'Interior', 32000, '2022-11-10'),

(6, 'Bolígrafo suave', 'Papelería', 1200, '2023-09-01'),

(7, 'Taza para creadores', 'Vajilla', 2500, '2023-04-15');

¿Todo listo? ¡Vamos a sumergirnos en el mundo de la cláusula LIMIT!


Fundamentos de la cláusula LIMIT: especificar la cantidad de registros a obtener

El uso más sencillo de la cláusula LIMIT es especificar la cantidad máxima de registros (filas) a recuperar. Su sintaxis es muy simple: solo debes agregar LIMIT cantidad al final de la sentencia SELECT.

Por ejemplo, vamos a obtener solo 3 registros de la tabla products.

SELECT * FROM products LIMIT 3;

Al ejecutar esta sentencia, se devolverán las primeras 3 filas en el orden en que están almacenadas en la tabla. Es muy intuitivo. Sin embargo, hay una advertencia importante: sin un orden definido, no se garantiza qué 3 registros se devolverán. El orden puede cambiar cada vez, dependiendo del comportamiento interno de la base de datos.

El verdadero poder de la cláusula LIMIT se revela cuando se combina con ORDER BY, como vimos en el artículo anterior.


¡El dúo más fuerte! ORDER BY + LIMIT para obtener los “Top N registros”

Obtener los “Top N registros”, como “los 3 productos más caros” o “los 5 lanzamientos más recientes”, es un requisito muy común en los sitios web. Esto se logra ordenando los datos con ORDER BY y luego limitando los resultados con LIMIT.

Vamos a obtener los 3 productos más caros. Usamos ORDER BY price DESC para ordenar por precio descendente, y luego LIMIT 3 para quedarnos con los 3 primeros.

-- Obtener los 3 productos más caros
SELECT * FROM products ORDER BY price DESC LIMIT 3;

¿Qué tal? Deberías ver “Silla con máxima comodidad”, “Teclado luminoso” y “Auriculares para concentración” en ese orden. Esta es la fórmula mágica: ordenar con ORDER BY y luego limitar con LIMIT. ¡Recuerda usarlos en conjunto!

Ahora obtendremos los “2 productos más recientes”. Esta vez ordenamos por fecha de lanzamiento (release_date).

-- Obtener los 2 productos más nuevos según fecha de lanzamiento
SELECT * FROM products ORDER BY release_date DESC LIMIT 2;

Desplazar el punto de inicio con OFFSET

La cláusula LIMIT tiene un gran aliado: OFFSET. Como su nombre lo indica, OFFSET especifica “cuántos registros omitir desde el inicio”.

Por ejemplo, si quieres “excluir el producto más caro y obtener el segundo y tercer más caros”, OFFSET te lo permite.

-- Ordenar por precio descendente, omitir el primero y obtener los siguientes 2
SELECT * FROM products ORDER BY price DESC LIMIT 2 OFFSET 1;

Este SQL se interpreta así:

  1. ORDER BY price DESC ordena los productos por precio de mayor a menor.
  2. OFFSET 1 omite el primer producto (el más caro).
  3. LIMIT 2 obtiene los 2 siguientes (el segundo y tercer más caros).

Esta combinación de LIMIT y OFFSET es la base de la técnica de “paginación” que veremos a continuación.


Avanzado: implementar paginación con LIMIT y OFFSET

La paginación es una técnica usada para dividir grandes conjuntos de datos —como listas de productos o artículos de blog— en varias páginas. Seguro has visto paginadores como “1, 2, 3, 4, 5, ... Siguiente”.

La paginación se implementa con LIMIT y OFFSET. Supongamos que quieres mostrar 3 productos por página:

Estas serían las consultas SQL. Para mantener el orden, ordenaremos por id.

【SQL para la Página 1】

-- Página 1: omitir 0 y obtener 3
SELECT * FROM products ORDER BY id LIMIT 3 OFFSET 0;

【SQL para la Página 2】

-- Página 2: omitir 3 y obtener 3
SELECT * FROM products ORDER BY id LIMIT 3 OFFSET 3;

【SQL para la Página 3】

-- Página 3: omitir 6 y obtener 3
SELECT * FROM products ORDER BY id LIMIT 3 OFFSET 6;

¿Lo notaste? El valor de LIMIT (elementos por página) es siempre 3. El valor de OFFSET crece como 0, 3, 6, .... Puedes calcularlo con la siguiente fórmula:

OFFSET = (número de página actual - 1) × elementos por página

Al implementar esta lógica en tu aplicación, podrás construir una paginación dinámica fácilmente. ¡Y no te preocupes! En la siguiente sección podrás experimentar con un entorno interactivo.


【¡Pruébalo!】Ejecuta SQL directamente en tu navegador

¡Gracias por esperar! Hemos preparado un entorno interactivo donde puedes ejecutar SQL directamente en tu navegador. Con esto, puedes probar tú mismo los diversos patrones de la cláusula LIMIT explicados en este artículo.

Copia todo el código a continuación, guárdalo con un nombre como index.html y ábrelo en tu navegador. Pega los ejemplos de SQL de este artículo en el área de texto y presiona el botón “Ejecutar SQL”.

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Entorno de Práctica SQL</title>
  <style>
    body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
    h1, h2 { color: #444; border-bottom: 2px solid #eee; padding-bottom: 0.3em;}
    textarea { width: 100%; height: 150px; font-family: monospace; font-size: 16px; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; margin-bottom: 1rem; }
    button { background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
    button:hover { background-color: #0056b3; }
    #result-container { margin-top: 1.5rem; min-height: 100px;}
    table { width: 100%; border-collapse: collapse; margin-top: 1rem; }
    th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
    th { background-color: #f8f8f8; }
    #error-message { color: red; font-weight: bold; margin-top: 1rem; }
  </style>
</head>
<body>

  <h1>¡Aprende ejecutando SQL! Campo de práctica de LIMIT</h1>
  <p>Ingresa una instrucción SQL en el área de texto inferior y haz clic en el botón “Ejecutar SQL”. ¡Prueba los diversos ejemplos de SQL presentados en el artículo!</p>

  <textarea id="sql-input">-- ¡Pega tu SQL aquí y ejecútalo!
-- Ejemplo: Los 3 productos más caros
SELECT * FROM products ORDER BY price DESC LIMIT 3;</textarea>
  <button onclick="executeQuery()">Ejecutar SQL</button>

  <h2>Resultado de la ejecución</h2>
  <div id="result-container"></div>
  <div id="error-message"></div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
  <script>
    let db;

    async function initDb() {
      try {
        const SQL = await initSqlJs({
          locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
        });
        db = new SQL.Database();
        
        const setupSQL = `
          CREATE TABLE products (id INT, name VARCHAR(255), category VARCHAR(255), price INT, release_date DATE);
          INSERT INTO products (id, name, category, price, release_date) VALUES
          (1, 'Cojín Peludo', 'Interior', 3200, '2023-04-15'),
          (2, 'Orejeras para concentración', 'Gadget', 7800, '2023-11-01'),
          (3, 'Cuaderno de ideas brillantes', 'Papelería', 1200, '2022-08-20'),
          (4, 'Teclado luminoso', 'Gadget', 15000, '2023-06-30'),
          (5, 'Silla de máxima comodidad', 'Interior', 32000, '2022-11-10'),
          (6, 'Bolígrafo suave', 'Papelería', 1200, '2023-09-01'),
          (7, 'Taza para creadores', 'Vajilla', 2500, '2023-04-15');
        `;
        db.run(setupSQL);
        executeQuery(); // Ejecutar SQL inicial
      } catch (e) {
        document.getElementById('error-message').textContent = 'Error al inicializar la base de datos: ' + e.message;
      }
    }

    function executeQuery() {
      const sqlInput = document.getElementById('sql-input').value;
      const resultContainer = document.getElementById('result-container');
      const errorMessage = document.getElementById('error-message');
      
      resultContainer.innerHTML = '';
      errorMessage.innerHTML = '';

      try {
        const results = db.exec(sqlInput);
        if (results.length > 0) {
          resultContainer.appendChild(createTable(results[0]));
        } else {
          resultContainer.innerHTML = '<p>La consulta se ejecutó correctamente, pero no se devolvió ningún conjunto de resultados. (por ejemplo: CREATE TABLE, INSERT)</p>';
        }
      } catch (e) {
        errorMessage.textContent = 'Error: ' + e.message;
      }
    }

    function createTable(result) {
      const table = document.createElement('table');
      const thead = document.createElement('thead');
      const tbody = document.createElement('tbody');
      const headerRow = document.createElement('tr');
      result.columns.forEach(colName => {
        const th = document.createElement('th');
        th.textContent = colName;
        headerRow.appendChild(th);
      });
      thead.appendChild(headerRow);
      result.values.forEach(rowData => {
        const tr = document.createElement('tr');
        rowData.forEach(cellData => {
          const td = document.createElement('td');
          td.textContent = cellData;
          tr.appendChild(td);
        });
        tbody.appendChild(tr);
      });
      table.appendChild(thead);
      table.appendChild(tbody);
      return table;
    }

    initDb();
  </script>
</body>
</html>

Complemento: diferencias de dialecto según la base de datos

La sintaxis LIMIT ... OFFSET ... explicada en este artículo es un formato estándar compatible con muchas bases de datos como MySQL, PostgreSQL y SQLite. Sin embargo, algunas bases de datos utilizan una sintaxis diferente (dialectos), así que a continuación te mostramos algunas como referencia.

En el caso de SQL Server

En versiones antiguas de Microsoft SQL Server se utilizaba la cláusula TOP, pero en versiones más recientes se recomienda usar OFFSET ... FETCH ....

-- Paginación en SQL Server (saltar 3 registros y obtener los siguientes 3)
SELECT * FROM products
ORDER BY id
OFFSET 3 ROWS
FETCH NEXT 3 ROWS ONLY;

En el caso de Oracle

La base de datos Oracle también utiliza la sintaxis OFFSET ... FETCH ..., similar a SQL Server.

-- Paginación en Oracle (saltar 3 registros y obtener los siguientes 3)
SELECT * FROM products
ORDER BY id
OFFSET 3 ROWS
FETCH NEXT 3 ROWS ONLY;

Como puedes ver, la sintaxis puede variar según la base de datos, pero el concepto básico (especificar cuántos registros omitir y cuántos recuperar) es exactamente el mismo.


Resumen: ¡Dominar LIMIT es dominar la visualización de datos!

En este artículo hemos explorado la cláusula LIMIT de SQL y su compañera OFFSET, desde lo básico hasta su uso avanzado. Hagamos un repaso de los puntos clave:

Obtener solo los datos necesarios en la cantidad justa ayuda a mantener el rendimiento de la base de datos y a ofrecer una experiencia de usuario fluida. ¡Prueba el entorno de demostración y domina completamente su funcionamiento!