Saludos estimado lector, en esta entrega te enseñaré como ordenar los resultados de un SELECT en MySQL, utilizando la clausura ORDER BY MySQL.
Que es ORDER BY
Cuando realizamos una consulta a una tabla en una base de datos utilizamos la sentencia SELECT, este resultado que obtenemos siempre viene ordenado por el orden en que fueron registrado en la tabla.
Para poder cambiar este orden necesitamos agregar ORDER BY a el SELECT, y este nos permitirá establecer el orden de los resultados.
MySQL SELECT con varias tablas - left join - inner join - right join - self join
Sintaxis
SELECT
campos
FROM
tabla
ORDER BY
columna1 [ASC|DESC],
columna2 [ASC|DESC]
En la sintaxis podemos ver que el ORDER BY está ubicado después de las tablas del FROM, es decir al final de la consulta.
Otra cosa a notar es que podemos especificar las columnas por las cuales serán ordenados los resultados, podemos especificar una o más columnas y no necesariamente tienen que estar ubicadas en el SELECT (algo que no es permitido en otros SGBD).
Y Por ultimo las palabras ASC y DESC, las cuales indican como deben ordenarse las filas o registros, ASC indica que los resultados serán ordenados de menor a mayor, entiéndase que si estamos tratando números serán desde el valor más pequeño hasta el más alto, y se hablamos de letras entonces serán ordenados desde la a hasta la z, en cuanto a la palabra DESC es el comportamiento contrario.
Ejemplos de ORDER BY
Las tablas utilizadas en los ejemplos está diponible para descargar aquí
Vamos a mostrar el nombre de los productos con idProducto inferior a 10 y ordenarlo de menor a mayor.
SELECT IdProducto, NombreProducto
FROM producto
WHERE idProducto < 10
ORDER BY IdProducto ASC
IdProducto | NombreProducto |
1 | Té Dharamsala |
2 | Cerveza tibetana Barley |
3 | Sirope de regaliz |
4 | Especias Cajun del chef Anton |
5 | Mezcla Gumbo del chef Anton |
6 | Mermelada de grosellas de la abuela |
7 | Peras secas orgánicas del tío Bob |
8 | Salsa de arándanos Northwoods |
9 | Buey Mishi Kobe |
Si en cambio queremos ordenar de mayor a menor entonces tenemos que cambiar la clausura ASC por DESC.
SELECT IdProducto, NombreProducto
FROM producto
WHERE idProducto < 10
ORDER BY IdProducto DESC
IdProducto | NombreProducto |
9 | Buey Mishi Kobe |
8 | Salsa de arándanos Northwoods |
7 | Peras secas orgánicas del tío Bob |
6 | Mermelada de grosellas de la abuela |
5 | Mezcla Gumbo del chef Anton |
4 | Especias Cajun del chef Anton |
3 | Sirope de regaliz |
2 | Cerveza tibetana Barley |
1 | Té Dharamsala |
También es posible utilizar ORDER BY con varias columnas.
La tabla a utilizar es empleado
Como ejemplo mostraré los nombres de los empleados ordenados primero por nombre y luego por apellido.
SELECT Nombre, Apellidos
FROM empleado
ORDER BY Nombre, Apellidos
Nombre | Apellidos |
Andrew | Fuller |
Anne | Dodsworth |
Janet | Leverling |
Laura | Callahan |
Margaret | Peacock |
Michael | Suyama |
Nancy | Davolio |
Robert | King |
Steven | Buchanan |
Quiero destacar que cuando no se especifica el tipo de ordenamiento (ASC o DESC), se asume que es ASC.
SELECT Nombre, Apellidos, Ciudad
FROM empleado
ORDER BY Nombre ASC, Apellidos DESC
En este caso primero se ordena por nombre y una vez ordenado, entonces se ordena por apellido.
También es importante recordar que los campos o columnas no se ordenan independiente de sus filas, sino que las filas completas son las que son ordenadas.
ORDER BY con expresiones
También podemos ordenar los resultados utilizando cálculos y expresiones aritméticas.
Por ejemplo:
SELECT
IdPedido,
IdProducto,
PrecioUnidad * Cantidad
FROM
pedido_detalle
ORDER BY
PrecioUnidad *Cantidad ASC
IdPedido | IdProducto | PrecioUnidad*Cantidad |
10462 | 13 | 4.800000190734863 |
10281 | 19 | 7.300000190734863 |
10420 | 13 | 9.600000381469727 |
10850 | 33 | 10 |
10782 | 31 | 12.5 |
10623 | 24 | 13.5 |
11077 | 52 | 14 |
11038 | 52 | 14 |
10634 | 75 | 15.5 |
10341 | 33 | 16 |
Para evitar tener que poner la expresión en el SELECT y volver a repetirla en el ORDER BY podemos utilizar alias y así hacer el código más comprensible.
SELECT
IdPedido,
IdProducto,
PrecioUnidad * Cantidad AS total
FROM
pedido_detalle
ORDER BY
total ASC
IdPedido | IdProducto | Total |
10462 | 13 | 4.800000190734863 |
10281 | 19 | 7.300000190734863 |
10420 | 13 | 9.600000381469727 |
10850 | 33 | 10 |
10782 | 31 | 12.5 |
10623 | 24 | 13.5 |
11077 | 52 | 14 |
11038 | 52 | 14 |
10634 | 75 | 15.5 |
10341 | 33 | 16 |
Ordenar con una lista personalizada
Para este ejemplo utilizaremos la tabla Empleado, y usaremos la funcion llamada FIELD().
SELECT
nombre,
apellido,
pais
FROM empleado
ORDER BY FIELD(
pais,
'EE.UU.',
'Reino Unido'
)
Nombre | Apellidos | Pais |
Nancy | Davolio | EE.UU. |
Andrew | Fuller | EE.UU. |
Janet | Leverling | EE.UU. |
Margaret | Peacock | EE.UU. |
Laura | Callahan | EE.UU. |
Steven | Buchanan | Reino Unido |
Michael | Suyama | Reino Unido |
Robert | King | Reino Unido |
Anne | Dodsworth | Reino Unido |
La función FIELD() trabaja mapeando los elementos que se le pasan como argumentos. Y en el orden que los establezcamos, ese sera el orden en que eran ordenados por el ORDER BY.
Hay que dejar claro que el primer parámetro es el nombre del campo que sera usado para ordenar.
Espero que este post te sea de mucha utilidad, no te olvides de compartir y valorar este contenido.