Aprende leyendo en orden

DISTINCT, ORDER BY, LIMIT — dar forma al conjunto de resultados

Aprende SQL DISTINCT, ORDER BY, LIMIT y OFFSET. Cubre deduplicación, ordenación, límite de filas y paginación con OFFSET — todo ejecutándose en vivo en tu navegador sobre un dataset score cargado desde CSV.

Datos que usaremos — la tabla score cargada desde CSV

Este artículo usa una tabla `score` cargada automáticamente desde un archivo CSV para recorrer las cuatro construcciones que dan forma a la salida de SELECTDISTINCT (deduplicación), ORDER BY (ordenación), LIMIT (cantidad de filas) y OFFSET (saltar desde el inicio).

La tabla score tiene 5 columnas — id / name / subject / score / recorded_on — con 15 filas en total: 5 estudiantes (Alice / Bob / Carol / Dave / Eve) cada uno con 3 asignaturas (Math / English / Science).

Antes de los ejercicios, confirma las definiciones de columnas de la tabla score y una muestra de los datos.

① Ejecuta PRAGMA table_info(score); para comprobar nombres de columnas, tipos y claves primarias.

② Ejecuta SELECT * FROM score LIMIT 5; para previsualizar las primeras 5 filas.

Editor SQL

Ejecutar una consulta para ver el resultado

DISTINCT — devolver solo filas únicas

Un resultado de SELECT puede contener la misma fila varias veces. Por ejemplo, sacar solo la columna name de score devuelve 15 filas — Alice / Bob / Carol / Dave / Eve, tres asignaturas cada uno.

Escribir `SELECT DISTINCT col, ...` colapsa las filas duplicadas en una sola en el conjunto de resultados. Con varias columnas, las filas se consideran duplicadas cuando la combinación de columnas coincide.

Cómo funciona DISTINCT
SELECT name FROM score;SELECT DISTINCT name FROM score;AliceAliceAliceBobAliceCarolBobDaveBob ...Eve15 filas en total (con duplicados)5 filas en total (tras dedup)
Un SELECT sin DISTINCT devuelve las filas duplicadas tal cual; con DISTINCT, las filas con el mismo valor se colapsan en una.
-- Lista los nombres únicos de estudiantes
SELECT DISTINCT name FROM score;

-- Lista las asignaturas únicas
SELECT DISTINCT subject FROM score;

-- Dedup sobre la combinación (name, subject) (= las 15 filas son únicas)
SELECT DISTINCT name, subject FROM score;

Ejecuta dos consultas en paralelo en una sola consola para ver cómo cambia el resultado con y sin DISTINCT. (Una vez lo ejecutes correctamente, aparecerá la explicación.)

① De score, saca la columna name sin `DISTINCT`.

② En la misma consola, saca la columna name con `DISTINCT`.

③ Confirma que la primera devuelve 15 filas (cada nombre 3 veces) y la segunda devuelve 5 filas (duplicados colapsados).

Editor SQL

Ejecutar una consulta para ver el resultado

ORDER BY — ordenar el resultado

SQL no garantiza el orden de las filas por defecto — SELECT * FROM score; deja que la implementación del DB decida en qué orden vuelven las filas. Cuando quieres un orden específico, añade `ORDER BY col [ASC|DESC]`.

- ASC (ascendente / de menor a mayor) es el valor por defecto y se puede omitir

- DESC (descendente / de mayor a menor) debe escribirse explícitamente

- Una lista de varias columnas separadas por comas te da una ordenación multinivel: las filas empatadas en la primera columna se ordenan por la segunda

ORDER BY ascendente y descendente
Original(sin orden)ORDER BY score(ASC = ascendente)ORDER BY score DESC(descendente)Alice 92Dave 65Carol 95Bob 76Bob 76Alice 92Carol 95Eve 87Eve 87Dave 65Alice 92Bob 76Eve 87Carol 95Dave 65
Sin ORDER BY, el orden no está garantizado; especificar ASC / DESC produce el orden que quieres. El valor por defecto es ASC (ascendente).
-- 1) Ascendente por una columna (ASC se puede omitir)
SELECT name, score FROM score ORDER BY score;

-- 2) Descendente por una columna
SELECT name, score FROM score ORDER BY score DESC;

-- 3) Ordenación por varias columnas (por subject, luego score más alto primero dentro de cada asignatura)
SELECT name, subject, score FROM score ORDER BY subject ASC, score DESC;

La letra pequeña de ORDER BY

- ORDER BY va después de `WHERE` y antes de `LIMIT`. Memoriza el orden SELECT cols FROM table WHERE condition ORDER BY col DESC LIMIT N; y no te liarás.

- El lado derecho de ORDER BY puede aceptar un número de columna (ORDER BY 2 DESC ordena por la 2ª columna seleccionada), pero perjudica la legibilidad — la convención es usar nombres de columna.

- En la consola de este curso, la ordenación de cadenas es mayúsculas → minúsculas (orden ASCII). Algunos DB tratan 'A' y 'a' como equivalentes.

Imagina una pantalla de listado de puntuaciones donde quieres los estudiantes ordenados por nombre, y dentro de cada estudiante, la asignatura con menor puntuación primero.

① De score, saca las columnas name, subject y score.

② Ordena por `name` ascendente y dentro del mismo nombre por `score` ascendente.

③ Confirma que el resultado son 15 filas, empezando por Alice Science 78 y terminando por Eve English 93.

Editor SQL

Ejecutar una consulta para ver el resultado

Mismo orden de nombres que el Ejercicio 2, pero esta vez quieres las asignaturas con mayor puntuación primero dentro de cada estudiante.

① De score, saca las columnas name, subject y score.

② Ordena por `name` ascendente y dentro del mismo nombre por `score` descendente.

③ Confirma que el resultado son 15 filas, empezando por Alice Math 92 y terminando por Eve Science 86.

Editor SQL

Ejecutar una consulta para ver el resultado

LIMIT y OFFSET — acotar la cantidad y paginar

Cuando los conjuntos de resultados se hacen grandes — 100 filas, 10.000 filas — volcar todo en pantalla es pesado y el usuario no puede asimilarlo. Añadir `LIMIT N` devuelve solo las primeras N filas. Combínalo con `OFFSET M` para saltar las primeras M filas y luego tomar N, lo que te da paginación para cosas como "elementos 6–10" o "elementos 11–20".

Paginación con LIMIT y OFFSET
Tras ORDER BY(las 7 filas)LIMIT 3(página 1)LIMIT 3 OFFSET 3(página 2)1º Carol 95tomarsaltar2º Eve 93tomarsaltar3º Alice 92tomarsaltar4º Bob 90tomar5º Bob 88tomar6º Eve 87tomar7º Eve 86
Sobre el resultado ordenado por ORDER BY, LIMIT decide "cuántas tomar" y OFFSET decide "cuántas saltar desde el inicio". La fórmula básica es OFFSET = (número de página - 1) × filas por página.
-- 1) Toma los 5 primeros (ranking TOP 5)
SELECT name, subject, score FROM score
ORDER BY score DESC
LIMIT 5;

-- 2) Toma los elementos 6 al 10 (página 2)
SELECT name, subject, score FROM score
ORDER BY score DESC
LIMIT 5 OFFSET 5;

-- 3) Fórmula de paginación: página N, K filas por página
--    LIMIT K OFFSET (N - 1) * K
--    p. ej. página 3, 5 por página → LIMIT 5 OFFSET 10
PáginaFilas por páginaOFFSETLIMITRango objetivo
15051–5
25556–10
3510511–15
1100101–10
210101011–20
1200201–20

LIMIT sin ORDER BY no garantiza el orden

Escribir solo `LIMIT` y omitir `ORDER BY` como SELECT * FROM score LIMIT 5; deja la elección de qué 5 filas vuelven a la implementación del DB. Incluso en un DB que tiende a devolver filas en orden de inserción (como SQLite), el estándar SQL dice que el orden está indefinido. En MySQL / PostgreSQL, los índices y los planes de ejecución pueden cambiar qué filas obtienes.

Para cualquier cosa donde el orden importe — rankings, paginación, "primeros N elementos" — escribe siempre `ORDER BY` antes de `LIMIT`.

Imagina un dashboard que necesita un widget de "top 5 entre todas las asignaturas".

① De score, saca las columnas name, subject y score.

② Ordena por `score` descendente y toma solo las primeras 5 filas.

③ Confirma que el resultado son 5 filas, empezando por Carol Math 95 y terminando por Bob English 88.

Editor SQL

Ejecutar una consulta para ver el resultado

Imagina un botón "Mostrar más" en un dashboard que carga los siguientes 5 elementos después de los 5 primeros.

① Mismo orden que el Ejercicio 4 (score descendente), sacando las columnas name, subject y score.

Salta las primeras 5 filas y toma las 5 siguientes (rangos 6–10).

③ Confirma que el resultado son 5 filas, empezando por Eve Math 87 y terminando por Alice Science 78.

Editor SQL

Ejecutar una consulta para ver el resultado
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Cuál de las siguientes describe correctamente SELECT DISTINCT?

Pregunta 2¿Qué devuelve SELECT name, score FROM score ORDER BY score DESC;?

Pregunta 3¿Qué filas devuelve SELECT * FROM score ORDER BY score DESC LIMIT 5 OFFSET 10;?