Ordenación: la cláusula ORDER BY

Al ejecutar una consulta SELECT, las filas se devuelven por defecto en un orden indeterminado. El orden real depende de cómo el SGBD combine y recorra las tablas y de cómo estén dispuestos los datos en el disco, así que no puedes fiarte de él. Para ordenar los registros se usa la cláusula ORDER BY.

Estructura general de una consulta con ORDER BY

MySQL 8.4
SELECT campos_tabla FROM nombre_tabla
[WHERE condicion]
ORDER BY columna [ASC | DESC] [, ...];
  • [ ]parte opcional
  • a | buna de las opciones
  • ...se puede repetir
campos_tabla
Las columnas que aparecerán en el resultado.
nombre_tabla
La tabla de la que se seleccionan los datos.
condicion

Qué filas se seleccionan antes de ordenar.

Opcional
columna

La columna por cuyos valores se ordenan las filas. Puedes indicar varias columnas separadas por comas.

ASC | DESC

El sentido de la ordenación: ASC, ascendente (por defecto); DESC, descendente.

Palabra claveOpcional
ASCDESC

Por ejemplo, vamos a mostrar los nombres de las aerolíneas de la tabla Company en orden alfabético:

MySQL 8.4
SELECT name FROM Company ORDER BY name;
name
Aeroflot
Air_France
British_AW
Dale_avia
Don_avia

Orden ascendente y descendente para los tipos principales

Tipo de datosASC (ascendente)DESC (descendente)
Tipo cadenaOrden lexicográfico (alfabético) de la «A» a la «Z»

Primero van los registros que empiezan por «a», después por «b», etc.
Orden lexicográfico de la «Z» a la «A»

Primero van los registros que empiezan por «z», «y», etc.
Tipo numéricoDe menor a mayorDe mayor a menor
Fecha y horaDe la fecha/hora más antigua a la más reciente

Por ejemplo, primero 01/01/2024 y después 01/02/2024
De la fecha/hora más reciente a la más antigua

Por ejemplo, primero 01/02/2024 y después 01/01/2024
Tipo booleanofalse va antes que truetrue va antes que false
Valores NULLLos valores NULL van primeroLos valores NULL van al final
Tipo de datosASC (ascendente)DESC (descendente)
Tipo cadenaOrden lexicográfico (alfabético) de la «A» a la «Z»

Primero van los registros que empiezan por «a», después por «b», etc.
Orden lexicográfico de la «Z» a la «A»

Primero van los registros que empiezan por «z», «y», etc.
Tipo numéricoDe menor a mayorDe mayor a menor
Fecha y horaDe la fecha/hora más antigua a la más reciente

Por ejemplo, primero 01/01/2024 y después 01/02/2024
De la fecha/hora más reciente a la más antigua

Por ejemplo, primero 01/02/2024 y después 01/01/2024
Tipo booleanofalse va antes que truetrue va antes que false
Valores NULLLos valores NULL van al finalLos valores NULL van primero

Ordenación por varias columnas

Para ordenar los resultados por dos o más columnas, hay que indicarlas separadas por comas.

MySQL 8.4
ORDER BY columna_1 [ASC | DESC], columna_2 [ASC | DESC];
  • [ ]parte opcional
  • a | buna de las opciones
columna_1

La columna por la que se ordenan las filas en primer lugar.

columna_2

La columna por la que se ordenan las filas que tienen el mismo valor en columna_1.

ASC | DESC

El sentido de la ordenación para la columna detrás de la que aparece. Por defecto, ASC.

Palabra claveOpcional
ASCDESC

Los datos se ordenan por la primera columna, pero si hay varios registros con el mismo valor en la primera columna, estos se ordenan por la segunda. No hay límite en el número de columnas por las que se puede ordenar.

Vamos a mostrar la información de los vuelos de la tabla Trip, ordenada por ciudad de salida en orden ascendente y por ciudad de llegada en orden descendente:

MySQL 8.4
SELECT DISTINCT town_from, town_to FROM Trip
ORDER BY town_from, town_to DESC;
town_fromtown_to
LondonSingapore
LondonParis
MoscowRostov
ParisRostov
RostovVladivostok
RostovParis
RostovMoscow
SingaporeLondon
VladivostokRostov

En este ejemplo, primero los registros se ordenan por la columna town_from. Después se aplica la ordenación descendente por la columna town_to dentro de los grupos de filas que tienen el mismo valor en la columna town_from.

Demostración de la ordenación