Volver a la lista de artículos Artículos
Lectura de 10 minutos

Una Guía Detallada de SQL ORDER BY

A menudo es necesario mostrar la salida de la consulta SQL en un orden específico en lugar de arbitrariamente. En este artículo, explicaré las muchas maneras en que puedes hacerlo con la cláusula ORDER BY de SQL.

Para ordenar los registros en SQL, necesitarás usar la cláusula ORDER BY. En este artículo, explicaré en detalle cómo usar ORDER BY para ordenar la salida por una o más columnas, en orden ascendente (A-Z) o descendente (Z-A), y usando la(s) columna(s) existente(s) o usando la(s) columna(s) calculada(s) por una función agregada. No se preocupe, no es tan complicado como parece.

Cómo ordenar las filas en SQL

Si no ordena la salida de su consulta SQL, el orden de las filas será arbitrario. Si desea que las filas de la tabla resultante aparezcan en un orden específico, tendrá que utilizar la cláusula ORDER BY.

La sintaxis básica de ORDER BY es la siguiente:

SELECT ...columns...
FROM table
ORDER BY sorting_column ASC/DESC;
  • Después de la palabra clave ORDER BY, simplemente enumere la(s) columna(s) por la(s) que desea ordenar los registros.
  • No es necesario que estas columnas se muestren en la salida, es decir, que aparezcan en la sentencia SELECT.
  • El orden de clasificación (ascendente o descendente) se establece con las palabras clave DESC y ASC. La palabra clave ASC es opcional; si no se especifica ninguna palabra clave después del nombre de la columna, las filas se ordenarán por defecto en orden ascendente.
  • ORDER BY se sitúa al final de la consulta.

Consulte este artículo para ver una animación de cómo funciona ORDER BY. Ahora, veamos algunos casos prácticos de uso de ORDER BY.

Ordenar por una columna

Imagina que tenemos una tienda que vende disfraces de Halloween. Tenemos diferentes tipos de disfraces, máscaras, sombreros y accesorios en stock. Aquí está la tabla con nuestros products:

products
idnamecategoryquantityprice
11Wonder Womancostumes219.95
12Vampiremasks43.95
13Magic Wandaccessories62.50
14Wizard of Ozhats33.95
15Supermancostumes314.95
16Hulkcostumes212.50
17Witchhats44.95
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
20Freddy Kruegermasks33.95
21Alienmasks0NULL
22Cowboyhats34.95
23Ghostbusteraccessories213.95
24Swordaccessories73.50
25Zombiemasks82.95

Simple ORDER BY: Ordenación por una columna

Empecemos con un ejemplo muy básico: ordenar nuestros elementos alfabéticamente por su nombre. Para ordenar los ítems en orden alfabético, sólo necesitamos ordenar nuestro conjunto de resultados por la columna nombre en orden ascendente. Como sabemos, el orden ascendente es el predeterminado en SQL, por lo que se puede omitir la palabra clave ASC. Aquí está nuestra consulta:

SELECT *
FROM products
ORDER BY name;

Y aquí está el resultado, con todos los registros ordenados alfabéticamente según el nombre del producto:

idnamecategoryquantityprice
21Alienmasks0NULL
22Cowboyhats34.95
20Freddy Kruegermasks33.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
13Magic Wandaccessories62.50
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
15Supermancostumes314.95
24Swordaccessories73.50
12Vampiremasks43.95
17Witchhats44.95
14Wizard of Ozhats33.95
11Wonder Womancostumes219.95
25Zombiemasks82.95

Bastante sencillo, ¿verdad? Ahora vamos a ordenar nuestros disfraces de Halloween en función del precio, empezando por el más caro. Para ir del precio más alto al más bajo hay que ordenar en orden descendente. Por lo tanto, nuestra cláusula ORDER BY debe incluir la palabra clave DESC:

SELECT *
FROM products
ORDER BY price DESC;
idnamecategoryquantityprice
19Snow Whitecostumes123.95
11Wonder Womancostumes219.95
15Supermancostumes314.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
17Witchhats44.95
22Cowboyhats34.95
14Wizard of Ozhats33.95
12Vampiremasks43.95
20Freddy Kruegermasks33.95
24Swordaccessories73.50
25Zombiemasks82.95
13Magic Wandaccessories62.50
21Alienmasks0NULL
18Rapunzelcostumes0NULL

Aquí hay varias cosas interesantes a tener en cuenta sobre las ordenaciones SQL:

  • Ordenación de filas con el mismo valor. Algunos artículos de nuestra tabla tienen el mismo precio: concretamente, los sombreros de bruja y de vaquero cuestan 4,95 dólares, mientras que el sombrero del Mago de Oz y las máscaras de Vampiro y Freddy Krueger cuestan 3,95 dólares. ¿Cómo ordena SQL estas filas? En realidad, no hay reglas específicas para estos casos; el resultado es no determinista. En otras palabras, el orden de las filas que contienen el mismo valor de columna de ordenación puede variar cada vez que se ejecuta la consulta. Si necesita que el orden de las filas sea consistente, utilice una columna única para ordenar las filas. Si eso no es posible, vea si puede ordenar el conjunto de resultados utilizando una combinación de columnas que den como resultado un orden determinado. Más adelante en este artículo hablaremos de la ordenación por múltiples columnas.
  • Comportamiento de la ordenación para valores NULL. En la tabla de resultados anterior, las filas con valores NULL en la columna de ordenación se colocan al final de la tabla. Sin embargo, este comportamiento no es consistente en diferentes bases de datos relacionales. He utilizado MySQL para ejecutar esta consulta, y esta base de datos considera los valores NULL como el valor más bajo posible. Por lo tanto, los ordena en último lugar cuando se solicita el orden descendente. El resultado sería el mismo en las bases de datos SQL Server y SQLite. Sin embargo, las bases de datos PostgreSQL y Oracle tratan los NULL como los valores más grandes posibles y los ponen en primer lugar cuando se ordena de forma descendente. En la mayoría de los casos, puedes cambiar el comportamiento por defecto de ORDER BY con respecto a los valores NULL. Aprende cómo hacerlo en esta guía detallada.

Muy bien. Pasemos a ejemplos más complicados.

Ordenación por una columna calculada por una función agregada

En SQL, puede ordenar los resultados basándose en una o más columnas calculadas. Esta columna puede ser calculada usando una de las funciones de agregación (como AVG(), SUM(), COUNT(), MAX(), MIN()) u otro método. Veamos cómo funciona esto en la práctica.

En nuestro siguiente ejemplo, queremos ver qué categorías de productos incluyen artículos más caros. En concreto, queremos ordenar las categorías por el precio medio de los productos, empezando por los más caros.

Calcularemos el precio medio de cada categoría y luego ordenaremos las filas en orden descendente según esta columna calculada:

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY avg_price DESC;

Observe que la cláusula ORDER BY se coloca en último lugar, después de la cláusula GROUP BY. Este es el resultado:

categoryavg_price
costumes17.84
accessories6.65
hats4.62
masks3.62

Es bueno notar que ORDER BY acepta la notación numérica cuando se refiere a la columna de ordenación. Por ejemplo, para ordenar el conjunto de resultados en función de la primera columna, basta con escribir ORDER BY 1.

En consecuencia, la siguiente consulta nos daría el mismo resultado que en la tabla anterior:

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY 2 DESC;

Como la columna avg_price es la segunda en nuestra sentencia SELECT, podemos referirnos a ella en la cláusula ORDER BY utilizando '2'.

Este enfoque nos ahorra tiempo de escritura, pero tiene un inconveniente importante. Si se modifica la consulta añadiendo más campos a la sentencia SELECT, hay que acordarse de comprobar si el número de la cláusula ORDER BY sigue siendo relevante o hay que cambiarlo. Desgraciadamente, este paso se pasa por alto con bastante frecuencia, lo que da lugar a un orden erróneo en el conjunto de resultados.

Ordenar por varias columnas

ORDER BY permite ordenar el conjunto de resultados por dos o más columnas. Sin embargo, para utilizar esta herramienta de forma adecuada es necesario entender cómo funciona:

  • La ordenación empieza por ordenar los datos en función de la primera columna mencionada en la cláusula ORDER BY. Si esta columna contiene los mismos valores, las filas correspondientes se ordenan en función de la segunda columna mencionada en la cláusula ORDER BY, y así sucesivamente. Por lo tanto, el orden de las columnas es importante.
  • Puede elegir el orden (es decir, ascendente o descendente) para cada una de las columnas enumeradas en ORDER BY. Para especificar el orden, basta con poner la palabra clave DESC o ASC después de cada una de las columnas enumeradas. Si omite la palabra clave DESC / ASC, se ordenará por defecto en orden ascendente.

Veamos algunos ejemplos.

Ordenación por múltiples columnas en SQL

Tal vez recuerde que cuando estábamos ordenando nuestros productos según el precio, el resultado de la ordenación era indeterminado. En concreto, había varios artículos con el mismo precio que deberían haber aparecido en la misma posición, pero en realidad se ordenaban de forma aleatoria. Si queremos tener más control sobre el orden de clasificación en estos casos, debemos añadir otra columna a la cláusula ORDER BY.

Por ejemplo, podemos empezar ordenando los artículos en función de su precio (del más caro al más barato). A continuación, podemos optar por ordenar alfabéticamente los artículos con el mismo precio. Esto implica ordenar por precio en orden descendente y luego ordenar por nombre en orden ascendente. Esta es la consulta:

SELECT id, name, price
FROM products
ORDER BY price DESC, name;
idnameprice
19Snow White23.95
11Wonder Woman19.95
15Superman14.95
23Ghostbuster13.95
16Hulk12.50
22Cowboy4.95
17Witch4.95
20Freddy Krueger3.95
12Vampire3.95
14Wizard of Oz3.95
24Sword3.50
25Zombie2.95
13Magic Wand2.50
21AlienNULL
18RapunzelNULL

Hemos seleccionado sólo tres columnas para poder centrarnos más fácilmente en los resultados de la ordenación. Como puede ver:

  • Los sombreros de vaquero y de bruja tienen el mismo precio y ahora están ordenados alfabéticamente.
  • Del mismo modo, otro grupo de artículos con un precio de 3,95 dólares también está ordenado alfabéticamente por nombre.
  • Finalmente, SQL considera los valores NULL en la columna de precio como el mismo valor, por lo que tenemos esas filas ordenadas alfabéticamente según el nombre del artículo.

Se puede utilizar la notación numérica cuando se enumeran varias columnas en la cláusula ORDER BY; funciona de la misma manera. La siguiente consulta nos dará los mismos resultados que la anterior:

SELECT id, name, price
FROM items
ORDER BY 3 DESC, 2;

Sin embargo, debe tener mucho cuidado con la notación numérica, ya que la edición de la consulta puede cambiar el orden de las columnas - y por lo tanto la salida de la ordenación.

Ordenación por múltiples columnas calculadas

Añadamos complejidad a nuestro último ejemplo de ordenación. En este caso, queremos ordenar las categorías de productos por el número total de artículos en stock, empezando por la categoría con menos artículos. Si alguna de las categorías tiene el mismo número de artículos en stock, queremos que la categoría con el precio más alto del producto aparezca en primer lugar.

En otras palabras, queremos ordenar la salida por dos columnas, ambas calculadas con funciones de agregación. Además:

  • La suma del número de artículos de cada categoría debe ordenarse de forma ascendente.
  • El precio máximo de los productos en cada categoría debe ordenarse de forma descendente.

Aquí está la consulta y el resultado:

SELECT 
  category, 
  SUM(quantity) AS total_quantity, 
  MAX(price) AS max_price
FROM items
GROUP BY category
ORDER BY total_quantity, max_price DESC;
categorytotal_quantitymax_price
costumes823.95
hats104.95
accessories1513.95
masks153.95

En esta consulta, calculamos el número total de artículos (SUM(quantity)) y el precio máximo del producto (MAX(price)) para cada categoría (GROUP BY categoría). También asignamos los alias (total_quantity y max_price, respectivamente). Por último, ordenamos la salida por total_quantity en orden ascendente (omitiendo la palabra clave ASC ) y por max_price en orden descendente (utilizando la palabra clave DESC ).

Como era de esperar, la tabla está ordenada por el número total de artículos de cada categoría, empezando por disfraces (que es la que tiene menos artículos en stock). Pero fíjate en que las categorías de accesorios y máscaras tienen ambas 15 artículos en stock. En este caso, entra en juego la ordenación por la segunda columna y estas dos filas se ordenan según el producto más caro de la categoría correspondiente. En concreto, la categoría de accesorios va en primer lugar (ya que incluye a los Cazafantasmas, cuyo precio es de 13,95 dólares), mientras que la categoría de máscaras va en último lugar (ya que las máscaras más caras sólo cuestan 3,95 dólares).

Para aprender usos más avanzados de ORDER BY - como poner expresiones en la condición ORDER BY - consulte esta completa guía.

¡Es hora de practicar SQL ORDER BY!

ORDER BY parece bastante fácil de entender. Sin embargo, la ordenación de registros en SQL tiene muchos matices que se aprenden mejor con la práctica. Recomiendo empezar con el SQL para principiantes que, entre otras cosas, cubre todo lo que necesitas saber sobre la ordenación de filas en SQL. El curso es interactivo e incluye 149 retos de codificación, desde los más básicos hasta los más avanzados.

Si está dispuesto a construir una base sólida de SQL, considere la posibilidad de completar el curso de LearnSQL.es Principios básicos de SQL del curso. Incluye SQL para principiantes y dos cursos adicionales que cubren las funciones estándar de SQL, la creación y actualización de tablas en SQL, y mucho más.

Gracias por leer y ¡feliz aprendizaje!