ORDER BY, LIMIT y DISTINCT
En resumen: ORDER BY ordena el resultado, LIMIT y OFFSET toman una parte de él, y DISTINCT quita las filas repetidas.
Problema
El top 3 del escaparate
El dueño quiere los tres productos más caros en la página de inicio. Sabes cómo sacar el nombre y el precio. Pero ¿en qué orden salen las filas, y cómo tomas solo tres?
La idea
ORDER BY
ORDER BY ordena el resultado. Por defecto de menor a mayor:
DESC lo invierte, de mayor a menor:
Puedes ordenar por varias columnas: primero por la primera, y en caso de empate por la segunda. Los clientes por ciudad, y dentro de una ciudad por nombre:
El texto se ordena alfabéticamente, las fechas como 2026-10-19 por tiempo.
Más precisamente, para curiosos
Sin ORDER BY, el orden de las filas no está prometido. A menudo sale por id, pero eso es una casualidad de cómo la base leyó la tabla. Tras un cambio en la tabla o con un índice nuevo, el orden puede cambiar. Cuando el orden te importa, escribe ORDER BY.
La idea
LIMIT: solo las primeras
LIMIT n devuelve las primeras n filas del resultado. Junto con ORDER BY da un top N:
LIMIT se ejecuta al final, después de ordenar. Por eso «los tres más caros» es correcto. Sin ORDER BY serían tres productos cualquiera.
OFFSET salta filas. Así se hacen las páginas: la segunda página de pedidos, 10 por página:
Pruébalo
Los clientes nuevos
Muestra el nombre y la fecha de registro de los cinco clientes más nuevos, el más nuevo primero.
Solución
SELECT name, joined_at FROM customers
ORDER BY joined_at DESC
LIMIT 5;ORDER BY joined_at DESC LIMIT 5. Aquí la comprobación también mira el orden de las filas.
La idea
DISTINCT: sin repeticiones
¿De qué ciudades son los clientes? Con SELECT city, cada ciudad se repite tantas veces como clientes tiene. DISTINCT quita las repeticiones:
Seis ciudades y NULL: Boris no tiene ciudad, y esa ausencia también es un resultado aparte.
Pruébalo
Los estados de los pedidos
Muestra todos los estados distintos de los pedidos, en orden alfabético.
Solución
SELECT DISTINCT status FROM orders ORDER BY status;SELECT DISTINCT status FROM orders ORDER BY status. Cinco estados: de cancelled a shipped.
Ejercicio
Barato y con existencias
Muestra el nombre, el precio y las existencias de los cinco productos más baratos que hay en existencia, el más barato primero.
Solución
SELECT name, price, stock FROM products
WHERE stock > 0
ORDER BY price
LIMIT 5;WHERE stock > 0 ORDER BY price LIMIT 5. El orden de las partes importa: WHERE, luego ORDER BY, al final LIMIT. Los productos agotados se quedan fuera, aunque sean más baratos.
Más precisamente, para curiosos
¿Adónde van los NULL al ordenar? En SQLite y MySQL, ORDER BY city los pone primero; en PostgreSQL y Oracle van al final. Si te importa, dilo: ORDER BY city NULLS LAST. SQLite lo entiende desde la versión 3.30.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: SELECT: elegir columnas · WHERE: filtrar filas · NULL: sin valor
- Continúa en: Aritmética en una consulta · Funciones de fecha · CASE y los valores que faltan · Funciones de agregación: COUNT, SUM, AVG
- Ejercicios sobre el tema: Leer datos