ORDER BY

Cuando ejecutas un SELECT sin especificar un orden, MySQL no garantiza en qué secuencia devuelve las filas. En la práctica suelen aparecer en el orden en que se insertaron, pero esto no es fiable y puede cambiar según el motor de almacenamiento, los índices o las actualizaciones que se hayan hecho. Si necesitas un orden específico, debes usar ORDER BY.

Sintaxis

SELECT columnas
FROM tabla
WHERE condicion
ORDER BY columna1 [ASC | DESC], columna2 [ASC | DESC], ...;

La cláusula ORDER BY se escribe después del WHERE (si lo hay). Puedes ordenar por una o varias columnas, y para cada una especificar si el orden es ascendente (ASC) o descendente (DESC). Si no indicas dirección, MySQL usa ASC por defecto.

Orden ascendente

Ordenar los productos por precio de menor a mayor:

SELECT nombre, precio
FROM productos
ORDER BY precio;
nombreprecio
198412.99
Cien años de soledad14.99
El nombre del viento16.99
Cable USB-C a Lightning19.99
Banda elástica set x519.99
Camiseta algodón básica24.99
......
ASUS ROG Zephyrus1899.99

Como no indicamos ASC ni DESC, MySQL ordena de forma ascendente. Los productos más baratos aparecen primero. Observa que hay dos productos con precio 19.99: cuando varios registros tienen el mismo valor en la columna de ordenación, su orden relativo es indeterminado.

Orden descendente

Para invertir el orden, añade DESC:

SELECT nombre, precio
FROM productos
ORDER BY precio DESC;
nombreprecio
ASUS ROG Zephyrus1899.99
Lenovo ThinkPad X11549.00
MacBook Air M31399.00
iPhone 15 Pro1299.99
Samsung Galaxy S24899.99
Google Pixel 8699.00
......
198412.99

Ahora los productos más caros aparecen primero. DESC viene de "descending" (descendente).

Ordenar por múltiples columnas

Cuando ordenas por varias columnas, MySQL aplica el orden de izquierda a derecha. Primero ordena por la primera columna, y cuando hay empates, usa la segunda columna para desempatar:

SELECT nombre, puesto, salario
FROM empleados
ORDER BY salario DESC, nombre ASC;
nombrepuestosalario
RicardoDirector General75000.00
SofíaDirectora de Ventas55000.00
AlbertoDirector de Logística52000.00
NataliaVendedora Senior38000.00
CristinaResponsable de Almacén35000.00
DanielVendedor32000.00
PatriciaVendedora32000.00
RaúlVendedor Junior28000.00
InésOperaria de Almacén26000.00
MarcosOperario de Almacén26000.00

Los empleados se ordenan por salario de mayor a menor. Daniel y Patricia ganan lo mismo (32000), así que MySQL los desempata alfabéticamente por nombre (ASC). Lo mismo ocurre con Inés y Marcos (26000).

Cada columna puede tener su propia dirección. En este ejemplo, salario es DESC pero nombre es ASC.

Ordenar por texto

Cuando ordenas por una columna de texto, MySQL aplica un orden alfabético según la collation configurada. Con la collation por defecto (utf8mb4_0900_ai_ci), el orden no distingue mayúsculas y minúsculas ni acentos:

SELECT nombre, ciudad
FROM clientes
ORDER BY ciudad;
nombreciudad
LucíaA Coruña
CarlosBarcelona
LauraBarcelona
AlejandroBilbao
FernandoBurgos
MiguelCórdoba
......
JavierZaragoza
ElenaZaragoza

Las ciudades aparecen en orden alfabético. Barcelona tiene dos clientes, cuyo orden entre sí no está garantizado (a menos que añadas una segunda columna de ordenación).

Ordenar por expresiones

Puedes ordenar por el resultado de una expresión, no solo por columnas directas:

SELECT nombre, precio, stock, precio * stock AS valor_inventario
FROM productos
ORDER BY precio * stock DESC;
nombrepreciostockvalor_inventario
iPhone 15 Pro1299.994558499.55
Samsung Galaxy S24899.996255799.38
Xiaomi 14599.998047999.20
MacBook Air M31399.002534975.00
Lenovo ThinkPad X11549.001827882.00
ASUS ROG Zephyrus1899.991222799.88
............

A diferencia del WHERE, en el ORDER BY sí puedes usar alias definidos en el SELECT. Esto es porque MySQL procesa el ORDER BY después del SELECT:

SELECT nombre, precio * stock AS valor_inventario
FROM productos
ORDER BY valor_inventario DESC;

Esta consulta produce el mismo resultado que la anterior. Usar el alias es más legible y evita repetir la expresión.

Ordenar por posición ordinal

Puedes referirte a las columnas del SELECT por su posición numérica en lugar de por su nombre:

SELECT nombre, precio
FROM productos
ORDER BY 2 DESC;

El número 2 se refiere a la segunda columna del SELECT, que es precio. Esta forma es más concisa pero menos legible, y puede causar errores difíciles de detectar si alguien reordena las columnas del SELECT. Úsala solo para consultas rápidas en la terminal, nunca en código de aplicación.

Ordenar por columna no seleccionada

Puedes ordenar por una columna que no aparece en el SELECT:

SELECT nombre, precio
FROM productos
ORDER BY stock DESC;
nombreprecio
Camiseta algodón básica24.99
Cable USB-C a Lightning19.99
Funda iPhone silicona49.99
Banda elástica set x519.99
Camiseta técnica running34.99
Cargador USB-C 65W35.99
......

El resultado está ordenado por stock descendente, aunque la columna stock no aparece en la salida. MySQL puede acceder a cualquier columna de la tabla para ordenar, independientemente de las que muestre.

ORDER BY con WHERE

Cuando combinas WHERE y ORDER BY, primero se filtran las filas y después se ordenan las que quedan:

SELECT nombre, precio, stock
FROM productos
WHERE precio < 50
ORDER BY precio DESC;
nombrepreciostock
Sartén antiadherente 28cm39.9975
Clean Code39.9955
Cargador USB-C 65W35.99150
Camiseta técnica running34.99180
Eloquent JavaScript34.9942
Esterilla yoga premium29.99100
Diseño de APIs29.9960
Camiseta algodón básica24.99500
Cable USB-C a Lightning19.99300
Banda elástica set x519.99200
El nombre del viento16.9970
Cien años de soledad14.9985
198412.99110

El WHERE reduce los 30 productos a 13, y el ORDER BY los ordena por precio descendente.

Valores NULL en la ordenación

MySQL trata los valores NULL como los más bajos posibles en el orden. Con ASC, los NULL aparecen primero. Con DESC, aparecen al final:

SELECT nombre, telefono
FROM clientes
ORDER BY telefono ASC;
nombretelefono
PaulaNULL
MartaNULL
AlejandroNULL
Miguel601234567
Diego601234568
María612345678
......

Los tres clientes sin teléfono (NULL) aparecen al principio. Si quisieras que los NULL aparezcan al final con orden ascendente, podrías usar un truco:

SELECT nombre, telefono
FROM clientes
ORDER BY telefono IS NULL, telefono ASC;

La expresión telefono IS NULL devuelve 1 para los NULL y 0 para los demás. Al ordenar primero por esta expresión (0 antes que 1), los registros con valor aparecen primero y los NULL quedan al final.

Orden de procesamiento

Con ORDER BY, el orden completo de procesamiento es:

  1. FROM: identifica la tabla.
  2. WHERE: filtra filas.
  3. SELECT: evalúa expresiones y alias.
  4. ORDER BY: ordena el resultado.

El ORDER BY es la última operación, por eso puede usar alias del SELECT.

Practica con ORDER BY

Usa el editor para experimentar con distintas ordenaciones. Prueba a ordenar por varias columnas, combinar ASC y DESC, o usar expresiones:

Simulador SQL
Ctrl+Enter para ejecutar

En el siguiente artículo veremos cómo limitar el número de filas en el resultado con LIMIT.

Escrito por Eduardo Lázaro