SQLORDER BYtutorialbeginner

¿Qué es ORDER BY en SQL? Ordenar los resultados de una consulta para principiantes

ORDER BY ordena el resultado de una consulta SQL. Cubrimos ASC y DESC, la ordenación por varias columnas, los NULL en el orden y el clásico ORDER BY + LIMIT para el top-N. Muchos ejemplos y tres ejercicios.

7 min de lecturaSQL · ORDER BY · tutorial · beginner

ORDER BY es el comando de SQL para ordenar los resultados de una consulta. Sin él, la base de datos devuelve las filas en el orden que le apetezca — lo que al usuario le parece un caos. Con ORDER BY, dices explícitamente: «ordena por esta columna de menor a mayor» (o al revés).

Analogía: imagina una pila de libros sobre tu escritorio, amontonados al azar. ORDER BY title significa «colócalos alfabéticamente por título». ORDER BY year DESC significa «los más nuevos primero, los más antiguos al final».

Por qué importa ORDER BY

Sin ordenación, SQL no te da ninguna garantía sobre el orden de las filas. La misma consulta ejecutada dos veces seguidas puede devolver las filas en órdenes distintos. Así que si el orden importa en tu resultado (top 10 de ventas, noticias por fecha, tablas de clasificación) — ORDER BY es obligatorio.

Escenarios típicos:

  • Listas en la interfaz: mostrar productos del más barato al más caro
  • Rankings: top 10 de usuarios por puntos
  • Cronologías: publicaciones de la más nueva a la más antigua
  • Búsquedas alfabéticas: lista de ciudades de la A a la Z

Sintaxis básica

SELECT *
FROM table_name
ORDER BY column_name [ASC | DESC];
  • ASC — ascendente (de menor a mayor). Es el valor predeterminado — puedes omitirlo.
  • DESC — descendente (de mayor a menor).

Ejemplo: una tabla de libros de una biblioteca.

SELECT title, year
FROM books
ORDER BY year DESC;

Esto lista los libros del más nuevo al más antiguo.

Ejemplo: una biblioteca

Tabla books:

idtitleauthoryearrating
1War and PeaceLeo Tolstoy18694.8
2The Master and MargaritaMikhail Bulgakov19674.9
3And Quiet Flows the DonMikhail Sholokhov19404.7
4Crime and PunishmentFyodor Dostoevsky18664.8

Consulta — ordenar por año de publicación (ascendente):

SELECT title, year FROM books ORDER BY year;

Resultado:

titleyear
Crime and Punishment1866
War and Peace1869
And Quiet Flows the Don1940
The Master and Margarita1967

El más antiguo arriba. Cambia a DESC y el orden se invierte — el más nuevo primero.

Ordenar por varias columnas

A menudo una sola columna no basta. El mismo año de publicación, y luego desempatas por valoración. Solo tienes que enumerarlas con comas:

SELECT title, year, rating
FROM books
ORDER BY year DESC, rating DESC;

Cómo funciona:

  1. La base de datos ordena primero por year DESC (lo más nuevo arriba).
  2. Dentro de las filas que comparten el mismo año, ordena por rating DESC.
  3. Si hubiera un tercer campo, desempataría dentro de las combinaciones idénticas de año + valoración.

A esto se le llama «ordenación multinivel». Muy habitual: «primero por fecha, luego por prioridad dentro de una fecha», «primero por estado, luego por importe dentro de un estado».

Ejemplo multinivel. Tabla employees:

idnamedepartmentsalary
1AnnaIT4000
2BorisSales2700
3VeraIT5000
4GrishaHR2300
5DenisIT4000
6ElenaSales3200

Consulta: primero por departamento (alfabético), luego dentro del departamento por salario (de mayor a menor).

SELECT name, department, salary
FROM employees
ORDER BY department ASC, salary DESC;

Resultado:

namedepartmentsalary
GrishaHR2300
VeraIT5000
AnnaIT4000
DenisIT4000
ElenaSales3200
BorisSales2700

Departamentos en orden alfabético: HR → IT → Sales. Dentro de IT — Vera (5000), luego Anna y Denis (ambos 4000, orden indefinido entre ellos), y así sucesivamente.

¿Quieres un orden determinista entre Anna y Denis? Añade un tercer nivel, por ejemplo por nombre: ORDER BY department ASC, salary DESC, name ASC.

Ordenar por una expresión

ORDER BY admite no solo nombres de columna, sino también expresiones:

SELECT title, likes, views
FROM posts
ORDER BY likes::float / views DESC;

Esto ordena las publicaciones por «tasa de interacción» — los «me gusta» divididos entre las visualizaciones. La tabla no tiene esa columna, pero la base de datos la calcula sobre la marcha.

Otro patrón habitual — usar funciones:

SELECT name FROM users ORDER BY LOWER(name);

LOWER pasa el nombre a minúsculas para una ordenación que no distingue mayúsculas.

Top-N: ORDER BY + LIMIT

La combinación clásica. Para obtener «las 3 publicaciones con más me gusta», ordenas primero y luego truncas:

SELECT title, likes
FROM posts
ORDER BY likes DESC
LIMIT 3;

Primero ORDER BY likes DESC pone arriba las más valoradas, luego LIMIT 3 conserva las tres primeras. Sin ORDER BY, LIMIT 3 devuelve tres filas arbitrarias — un error clásico de principiante.

NULL en la ordenación

Si una columna tiene valores NULL, las bases de datos difieren en dónde colocarlos:

  • PostgreSQL: ASC — los NULL al final; DESC — al principio.
  • MySQL: ASC — los NULL al principio; DESC — al final.

Si necesitas ser explícito, PostgreSQL tiene NULLS FIRST / NULLS LAST:

SELECT title, published_at
FROM posts
ORDER BY published_at DESC NULLS LAST;

Esto da: las publicaciones recientes primero, los borradores (sin fecha de publicación) al final del todo. MySQL no tiene esa sintaxis — tienes que simularla con una expresión: ORDER BY published_at IS NULL, published_at DESC.

Ejemplo más grande: antes y después

Tabla orders:

idcustomeramountstatuscreated_at
1Anna500paid2024-03-10
2Boris1500paid2024-03-15
3Vera200cancelled2024-03-12
4Grisha3000paid2024-03-08
5Denis800pending2024-03-15

Objetivo: «primero los pagados, luego los pendientes, luego los cancelados. Dentro de cada grupo, los más nuevos arriba; los empates se rompen por importe mayor primero».

SELECT id, customer, status, amount, created_at
FROM orders
ORDER BY
  CASE status
    WHEN 'paid'      THEN 1
    WHEN 'pending'   THEN 2
    WHEN 'cancelled' THEN 3
  END,
  created_at DESC,
  amount DESC;

Resultado:

idcustomerstatusamountcreated_at
2Borispaid15002024-03-15
1Annapaid5002024-03-10
4Grishapaid30002024-03-08
5Denispending8002024-03-15
3Veracancelled2002024-03-12

CASE es la forma de expresar un orden personalizado para una columna de texto. Alfabéticamente, cancelled iría antes que paid — pero a nosotros nos importa el significado, no el alfabeto.

Errores habituales de principiante

1. Olvidar que sin ORDER BY el orden no está garantizado. La gente da por hecho que «la base de datos mantiene el orden de inserción». No lo hace — el orden puede ser cualquiera y puede cambiar entre ejecuciones. ¿Necesitas un orden? Escribe ORDER BY.

2. ORDER BY antes de FROM. El orden de las cláusulas es fijo: SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT. ORDER BY siempre va casi al final.

3. Ordenar por una columna que no está en SELECT. La mayoría de las bases de datos lo permiten — puedes ordenar por cualquier columna de la tabla aunque no esté en la salida. Excepción: cuando haces SELECT DISTINCT, ordenar por una columna que no está en la salida da error, porque DISTINCT descarta los datos necesarios para ordenar.

4. ORDER BY 1, 2. Puedes ordenar por el ordinal de columna en SELECT1 es la primera columna, 2 la segunda. Funciona, pero se lee mal. Usa nombres.

5. ORDER BY y UNION. Cuando haces UNION de dos consultas, ORDER BY se escribe una sola vez al final del todo y se aplica al resultado combinado. No puedes ponerlo dentro de las partes individuales del UNION.

6. Números como cadenas. Si una columna VARCHAR almacena números ("10", "2", "100"), la ordenación es alfabética, no numérica: "10", "100", "2". Soluciónalo con una conversión ORDER BY CAST(col AS INTEGER), o almacena los números como números desde el principio.

Resumen rápido

  • ORDER BY ordena el resultado de la consulta.
  • ASC (predeterminado) es ascendente, DESC es descendente.
  • Ordena por varias columnas con comas — ordenación multinivel.
  • Las expresiones y funciones son válidas en ORDER BY, no solo los nombres de columna.
  • Sin ORDER BY, no se garantiza ningún orden.
  • Combinado con LIMIT te da el top-N.
  • Ojo con los NULL — las bases de datos los colocan de forma distinta.

Pruébalo tú

Sobre la tabla books:

  1. Lista los libros de mayor a menor valoración.
  2. Ordena por autor (alfabético), y luego dentro de un autor por año (del más antiguo al más nuevo).
  3. Top 3 de libros por valoración (combinación ORDER BY + LIMIT).

Escribe primero las consultas por tu cuenta. La ordenación es una de las operaciones más intuitivas de SQL — la pillarás rápido.

Practica con ejercicios reales

Resuelve ejercicios en el entrenador de SQL con corrección instantánea y pistas.

Abrir el entrenador