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:
| id | title | author | year | rating |
|---|
| 1 | War and Peace | Leo Tolstoy | 1869 | 4.8 |
| 2 | The Master and Margarita | Mikhail Bulgakov | 1967 | 4.9 |
| 3 | And Quiet Flows the Don | Mikhail Sholokhov | 1940 | 4.7 |
| 4 | Crime and Punishment | Fyodor Dostoevsky | 1866 | 4.8 |
Consulta — ordenar por año de publicación (ascendente):
SELECT title, year FROM books ORDER BY year;
Resultado:
| title | year |
|---|
| Crime and Punishment | 1866 |
| War and Peace | 1869 |
| And Quiet Flows the Don | 1940 |
| The Master and Margarita | 1967 |
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:
- La base de datos ordena primero por
year DESC (lo más nuevo arriba).
- Dentro de las filas que comparten el mismo año, ordena por
rating DESC.
- 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:
| id | name | department | salary |
|---|
| 1 | Anna | IT | 4000 |
| 2 | Boris | Sales | 2700 |
| 3 | Vera | IT | 5000 |
| 4 | Grisha | HR | 2300 |
| 5 | Denis | IT | 4000 |
| 6 | Elena | Sales | 3200 |
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:
| name | department | salary |
|---|
| Grisha | HR | 2300 |
| Vera | IT | 5000 |
| Anna | IT | 4000 |
| Denis | IT | 4000 |
| Elena | Sales | 3200 |
| Boris | Sales | 2700 |
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:
| id | customer | amount | status | created_at |
|---|
| 1 | Anna | 500 | paid | 2024-03-10 |
| 2 | Boris | 1500 | paid | 2024-03-15 |
| 3 | Vera | 200 | cancelled | 2024-03-12 |
| 4 | Grisha | 3000 | paid | 2024-03-08 |
| 5 | Denis | 800 | pending | 2024-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:
| id | customer | status | amount | created_at |
|---|
| 2 | Boris | paid | 1500 | 2024-03-15 |
| 1 | Anna | paid | 500 | 2024-03-10 |
| 4 | Grisha | paid | 3000 | 2024-03-08 |
| 5 | Denis | pending | 800 | 2024-03-15 |
| 3 | Vera | cancelled | 200 | 2024-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 SELECT — 1 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:
- Lista los libros de mayor a menor valoración.
- Ordena por autor (alfabético), y luego dentro de un autor por año (del más antiguo al más nuevo).
- 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.
ORDER BYes 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. ConORDER 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 titlesignifica «colócalos alfabéticamente por título».ORDER BY year DESCsignifica «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 BYes obligatorio.Escenarios típicos:
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:Consulta — ordenar por año de publicación (ascendente):
SELECT title, year FROM books ORDER BY year;Resultado:
El más antiguo arriba. Cambia a
DESCy 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:
year DESC(lo más nuevo arriba).rating DESC.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: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:
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 BYadmite 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);LOWERpasa 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 DESCpone arriba las más valoradas, luegoLIMIT 3conserva las tres primeras. SinORDER BY,LIMIT 3devuelve 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:ASC— los NULL al final;DESC— al principio.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: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:
CASEes la forma de expresar un orden personalizado para una columna de texto. Alfabéticamente,cancellediría antes quepaid— 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 BYsiempre 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 SELECT —1es la primera columna,2la segunda. Funciona, pero se lee mal. Usa nombres.5. ORDER BY y UNION. Cuando haces
UNIONde dos consultas,ORDER BYse 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
VARCHARalmacena números ("10", "2", "100"), la ordenación es alfabética, no numérica: "10", "100", "2". Soluciónalo con una conversiónORDER BY CAST(col AS INTEGER), o almacena los números como números desde el principio.Resumen rápido
ORDER BYordena el resultado de la consulta.ASC(predeterminado) es ascendente,DESCes descendente.ORDER BY, no solo los nombres de columna.ORDER BY, no se garantiza ningún orden.LIMITte da el top-N.Pruébalo tú
Sobre la tabla
books: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.