En el vasto universo de las bases de datos, rara vez queremos ver la información de forma caótica o aleatoria. Para que los datos sean verdaderamente útiles, a menudo necesitamos presentarlos de una manera organizada, siguiendo un criterio lógico. Ya sea para un informe, un análisis o simplemente para una mejor visualización, ordenar los resultados de una consulta SQL es una tarea fundamental. Aquí es donde entra en juego la poderosa cláusula ORDER BY, la herramienta estándar en SQL para definir el orden en el que aparecen las filas en el resultado de una consulta.

Sin la cláusula ORDER BY, el orden en que se recuperan y muestran las filas puede ser impredecible. Depende de factores internos del sistema de gestión de base de datos (SGBD), como la forma en que los datos están almacenados físicamente o el plan de ejecución que el optimizador decide usar. Si necesitas garantizar que tus resultados sigan un orden específico y consistente, incorporar ORDER BY es indispensable. Este artículo te guiará a través de las diferentes formas de utilizar esta cláusula esencial.

- La Cláusula ORDER BY: Sintaxis Básica
- Ordenando por una Única Columna
- Ordenando por una Columna Calculada o Agregada
- Ordenando por Múltiples Columnas
- Preguntas Frecuentes sobre ORDER BY
- ¿ORDER BY afecta el rendimiento de la consulta?
- ¿Puedo usar ORDER BY con columnas que no selecciono?
- ¿Cuál es el orden predeterminado si no especifico ASC o DESC?
- ¿Cómo se ordenan los diferentes tipos de datos?
- ¿ORDER BY siempre garantiza el mismo orden para filas idénticas?
- ¿Puedo ordenar por una expresión o función en ORDER BY?
- Conclusión
La Cláusula ORDER BY: Sintaxis Básica
La sintaxis fundamental de ORDER BY es sencilla. Se añade al final de una sentencia SELECT, después de cualquier cláusula FROM, WHERE, GROUP BY o HAVING. La estructura general es la siguiente:
SELECT columna1, columna2, ... FROM nombre_tabla WHERE condicion GROUP BY columna_agrupacion HAVING condicion_agrupacion ORDER BY columna_ordenacion [ASC | DESC], otra_columna_ordenacion [ASC | DESC], ...;
Después de las palabras clave ORDER BY, especificas la columna o columnas por las que deseas ordenar los resultados. La clave está en que estas columnas no tienen por qué estar incluidas en la lista de columnas que se seleccionan después de SELECT. Puedes ordenar por cualquier columna accesible desde la tabla o tablas en tu consulta.
Para controlar la dirección de la ordenación, utilizas las palabras clave ASC (ascendente) o DESC (descendente). Si no especificas ninguna de estas palabras clave después de un nombre de columna, el SGBD asumirá por defecto el orden ascendente (ASC). Esto significa que los valores numéricos se ordenarán de menor a mayor, las cadenas de texto alfabéticamente (A-Z), y las fechas de la más antigua a la más reciente.
Ordenando por una Única Columna
El caso de uso más común es ordenar los resultados basándose en los valores de una sola columna. Esto te permite, por ejemplo, listar productos por nombre, empleados por salario o transacciones por fecha.
Consideremos una tabla simple llamada
productos
con información sobre artículos en stock. Aquí tienes un ejemplo de su estructura y algunos datos:
| id | nombre | categoria | cantidad | precio |
|---|---|---|---|---|
| 11 | Disfraz Mujer Maravilla | disfraces | 2 | 19.95 |
| 12 | Máscara Vampiro | máscaras | 4 | 3.95 |
| 13 | Varita Mágica | accesorios | 6 | 2.50 |
| 14 | Sombrero Mago Oz | sombreros | 3 | 3.95 |
| 15 | Disfraz Superman | disfraces | 3 | 14.95 |
| 16 | Disfraz Hulk | disfraces | 2 | 12.50 |
| 17 | Sombrero Bruja | sombreros | 4 | 4.95 |
| 18 | Disfraz Rapunzel | disfraces | 0 | NULL |
| 19 | Disfraz Blancanieves | disfraces | 1 | 23.95 |
| 20 | Máscara Freddy Krueger | máscaras | 3 | 3.95 |
| 21 | Máscara Alien | máscaras | 0 | NULL |
| 22 | Sombrero Cowboy | sombreros | 3 | 4.95 |
| 23 | Accesorio Cazafantasmas | accesorios | 2 | 13.95 |
| 24 | Accesorio Espada | accesorios | 7 | 3.50 |
| 25 | Máscara Zombie | máscaras | 8 | 2.95 |
Si queremos listar todos los productos ordenados alfabéticamente por su nombre, usaríamos la siguiente consulta:
SELECT * FROM productos ORDER BY nombre ASC;
O, de forma equivalente, omitiendo ASC ya que es el valor por defecto:
SELECT * FROM productos ORDER BY nombre;
El resultado sería:
| id | nombre | categoria | cantidad | precio |
|---|---|---|---|---|
| 21 | Máscara Alien | máscaras | 0 | NULL |
| 23 | Accesorio Cazafantasmas | accesorios | 2 | 13.95 |
| 16 | Disfraz Hulk | disfraces | 2 | 12.50 |
| 13 | Varita Mágica | accesorios | 6 | 2.50 |
| 20 | Máscara Freddy Krueger | máscaras | 3 | 3.95 |
| 18 | Disfraz Rapunzel | disfraces | 0 | NULL |
| 19 | Disfraz Blancanieves | disfraces | 1 | 23.95 |
| 22 | Sombrero Cowboy | sombreros | 3 | 4.95 |
| 15 | Disfraz Superman | disfraces | 3 | 14.95 |
| 24 | Accesorio Espada | accesorios | 7 | 3.50 |
| 17 | Sombrero Bruja | sombreros | 4 | 4.95 |
| 12 | Máscara Vampiro | máscaras | 4 | 3.95 |
| 14 | Sombrero Mago Oz | sombreros | 3 | 3.95 |
| 11 | Disfraz Mujer Maravilla | disfraces | 2 | 19.95 |
| 25 | Máscara Zombie | máscaras | 8 | 2.95 |
Ahora, si quisiéramos ver los productos ordenados por precio, del más caro al más barato, necesitaríamos usar el orden descendente (DESC):
SELECT * FROM productos ORDER BY precio DESC;
El resultado sería:
| id | nombre | categoria | cantidad | precio |
|---|---|---|---|---|
| 19 | Disfraz Blancanieves | disfraces | 1 | 23.95 |
| 11 | Disfraz Mujer Maravilla | disfraces | 2 | 19.95 |
| 15 | Disfraz Superman | disfraces | 3 | 14.95 |
| 23 | Accesorio Cazafantasmas | accesorios | 2 | 13.95 |
| 16 | Disfraz Hulk | disfraces | 2 | 12.50 |
| 17 | Sombrero Bruja | sombreros | 4 | 4.95 |
| 22 | Sombrero Cowboy | sombreros | 3 | 4.95 |
| 12 | Máscara Vampiro | máscaras | 4 | 3.95 |
| 14 | Sombrero Mago Oz | sombreros | 3 | 3.95 |
| 20 | Máscara Freddy Krueger | máscaras | 3 | 3.95 |
| 24 | Accesorio Espada | accesorios | 7 | 3.50 |
| 25 | Máscara Zombie | máscaras | 8 | 2.95 |
| 13 | Varita Mágica | accesorios | 6 | 2.50 |
| 18 | Disfraz Rapunzel | disfraces | 0 | NULL |
| 21 | Máscara Alien | máscaras | 0 | NULL |
Consideraciones al Ordenar
Es importante tener en cuenta dos aspectos clave cuando se ordena por una única columna:
Filas con el Mismo Valor: ¿Qué sucede cuando varias filas tienen el mismo valor en la columna por la que estás ordenando? Por ejemplo, varios productos tienen el mismo precio en la tabla anterior. En SQL, el orden relativo de estas filas 'empatadas' es no determinista por defecto. Esto significa que el SGBD puede devolverlas en cualquier orden, y este orden podría cambiar cada vez que ejecutes la consulta. Si necesitas un orden consistente incluso para filas con valores idénticos en la primera columna de ordenación, deberás añadir una o más columnas adicionales a tu cláusula ORDER BY para romper el empate (ver sección de ordenación por múltiples columnas).
Valores NULL: El manejo de los valores NULL en la ordenación puede variar entre diferentes sistemas de bases de datos. Algunas bases de datos, como MySQL, SQL Server y SQLite, consideran los NULL como los valores más bajos posibles. Esto significa que en un orden ascendente (ASC), los NULL aparecerán al principio, y en un orden descendente (DESC), aparecerán al final. Otras bases de datos, como PostgreSQL y Oracle, consideran los NULL como los valores más altos posibles. Esto implica que en un orden ascendente (ASC), los NULL aparecerán al final, y en un orden descendente (DESC), aparecerán al principio. Es crucial conocer el comportamiento de tu SGBD específico. La mayoría de los SGBD modernos permiten controlar explícitamente el comportamiento de los NULL en ORDER BY usando cláusulas como
NULLS FIRST
o
NULLS LAST
después del nombre de la columna y la dirección de ordenación (ej:
ORDER BY precio DESC NULLS LAST
).
Ordenando por una Columna Calculada o Agregada
La cláusula ORDER BY no se limita a ordenar por columnas que existen físicamente en la tabla. También puedes ordenar por valores que se calculan en la propia consulta, ya sea mediante una expresión aritmética, una función o, muy comúnmente, utilizando funciones de agregación como AVG(), SUM(), COUNT(), MAX() o MIN() en combinación con GROUP BY.
Supongamos que queremos ver qué categorías de productos tienen el precio medio más alto. Primero, calculamos el precio medio para cada categoría usando GROUP BY y AVG(), y luego ordenamos el resultado por este precio medio calculado de forma descendente:
SELECT categoria, AVG(precio) AS precio_medio FROM productos GROUP BY categoria ORDER BY precio_medio DESC;
Es fundamental recordar que cuando se utiliza GROUP BY, la cláusula ORDER BY debe aparecer después de GROUP BY (y de HAVING, si estuviera presente). El alias
precio_medio
que le dimos a la columna calculada puede ser usado directamente en la cláusula ORDER BY.
El resultado de esta consulta sería:
| categoria | precio_medio |
|---|---|
| disfraces | 17.84 |
| accesorios | 6.65 |
| sombreros | 4.62 |
| máscaras | 3.62 |
Una característica interesante de ORDER BY es que permite referirse a las columnas por su posición numérica en la lista de SELECT. Por ejemplo, la consulta anterior podría escribirse como:
SELECT categoria, AVG(precio) AS precio_medio FROM productos GROUP BY categoria ORDER BY 2 DESC;
Aquí,
ORDER BY 2
indica que la ordenación debe realizarse por la segunda columna listada en el SELECT (que es
AVG(precio)
o
precio_medio
). Si bien esto puede parecer conveniente y ahorrar algo de escritura, tiene una desventaja significativa: si modificas la sentencia SELECT añadiendo, eliminando o reordenando columnas, el número en ORDER BY ya no corresponderá a la columna deseada, lo que puede llevar a resultados incorrectos. Por esta razón, generalmente se considera una mejor práctica utilizar los nombres de las columnas o sus alias en ORDER BY.
Ordenando por Múltiples Columnas
Como mencionamos antes, para lograr un orden consistente o para aplicar criterios de ordenación secundarios, puedes especificar varias columnas en la cláusula ORDER BY. Las columnas se evalúan en el orden en que se listan. La ordenación se realiza primero por la primera columna. Si hay filas con valores idénticos en la primera columna, esas filas 'empatadas' se ordenan luego por la segunda columna especificada. Si aún hay empates, se pasa a la tercera columna, y así sucesivamente.
El orden en que se listan las columnas en ORDER BY es crucial porque define la prioridad de la ordenación. Puedes especificar una dirección de ordenación (ASC o DESC) para cada columna de forma independiente.
Retomando el ejemplo de ordenar productos por precio, vimos que varios productos tenían el mismo precio y su orden relativo era indeterminado. Para solucionarlo, podemos ordenar primero por precio (descendente) y luego, para los productos con el mismo precio, ordenarlos alfabéticamente por nombre (ascendente). La consulta sería:
SELECT id, nombre, precio FROM productos ORDER BY precio DESC, nombre ASC;
Como ASC es el valor por defecto, también podemos escribirlo como:
SELECT id, nombre, precio FROM productos ORDER BY precio DESC, nombre;
Observa el resultado para las filas con precios idénticos:
| id | nombre | precio |
|---|---|---|
| 19 | Disfraz Blancanieves | 23.95 |
| 11 | Disfraz Mujer Maravilla | 19.95 |
| 15 | Disfraz Superman | 14.95 |
| 23 | Accesorio Cazafantasmas | 13.95 |
| 16 | Disfraz Hulk | 12.50 |
| 22 | Sombrero Cowboy | 4.95 |
| 17 | Sombrero Bruja | 4.95 |
| 20 | Máscara Freddy Krueger | 3.95 |
| 12 | Máscara Vampiro | 3.95 |
| 14 | Sombrero Mago Oz | 3.95 |
| 24 | Accesorio Espada | 3.50 |
| 25 | Máscara Zombie | 2.95 |
| 13 | Varita Mágica | 2.50 |
| 21 | Máscara Alien | NULL |
| 18 | Disfraz Rapunzel | NULL |
Ahora, los sombreros de Cowboy y Bruja, que ambos cuestan 4.95, aparecen ordenados alfabéticamente por nombre ("Sombrero Cowboy" antes que "Sombrero Bruja"). De manera similar, los productos con precio 3.95 (Máscara Freddy Krueger, Máscara Vampiro, Sombrero Mago Oz) y los productos con precio NULL (Máscara Alien, Disfraz Rapunzel) también se ordenan alfabéticamente entre sí.
Ordenando por Múltiples Columnas Calculadas
La combinación de ORDER BY con múltiples columnas y funciones de agregación es muy potente para generar informes complejos. Imaginemos que queremos ordenar las categorías de productos primero por la cantidad total de artículos en stock (de menor a mayor) y, para las categorías con la misma cantidad total, ordenarlas por el precio máximo de un artículo en esa categoría (de mayor a menor).
La consulta requeriría calcular la suma de la cantidad y el máximo del precio para cada categoría, y luego ordenar por estas dos columnas calculadas:
SELECT categoria, SUM(cantidad) AS total_cantidad, MAX(precio) AS precio_maximo FROM productos GROUP BY categoria ORDER BY total_cantidad ASC, precio_maximo DESC;
El resultado mostraría las categorías ordenadas según estos criterios:
| categoria | total_cantidad | precio_maximo |
|---|---|---|
| disfraces | 8 | 23.95 |
| sombreros | 10 | 4.95 |
| accesorios | 15 | 13.95 |
| máscaras | 15 | 3.95 |
Observa cómo las categorías "accesorios" y "máscaras" tienen el mismo
total_cantidad
(15). La segunda columna de ordenación (
precio_maximo DESC
) entra en juego para estas filas. "accesorios" aparece primero porque su
precio_maximo
(13.95) es mayor que el de "máscaras" (3.95).
Preguntas Frecuentes sobre ORDER BY
Aquí respondemos algunas preguntas comunes sobre el uso de ORDER BY en SQL:
¿ORDER BY afecta el rendimiento de la consulta?
Sí, especialmente en tablas grandes. Ordenar requiere que el SGBD lea todos los datos relevantes y luego los organice. Si la tabla es muy grande y no hay un índice adecuado en las columnas por las que se ordena, el SGBD puede necesitar realizar una operación de clasificación costosa (sort operation). Un índice en las columnas de ordenación puede acelerar significativamente la operación, ya que los datos ya están pre-ordenados.
¿Puedo usar ORDER BY con columnas que no selecciono?
Absolutamente. La cláusula ORDER BY puede referirse a cualquier columna que esté disponible en el conjunto de resultados intermedio antes de la ordenación, incluso si esa columna no se incluye en la lista final del SELECT.
¿Cuál es el orden predeterminado si no especifico ASC o DESC?
Si omites ASC o DESC después de un nombre de columna en ORDER BY, el comportamiento predeterminado es la ordenación ascendente (ASC).
¿Cómo se ordenan los diferentes tipos de datos?
La ordenación se basa en la comparación de los valores según el tipo de dato:
- Números: De menor a mayor (ASC) o de mayor a menor (DESC).
- Cadenas de texto: Alfabéticamente, según la secuencia de caracteres definida por la intercalación (collation) de la base de datos o columna. Las mayúsculas y minúsculas pueden tratarse de forma diferente dependiendo de la configuración de la intercalación.
- Fechas y horas: Cronológicamente, de la más antigua a la más reciente (ASC) o de la más reciente a la más antigua (DESC).
- Valores booleanos: Generalmente, FALSE se considera menor que TRUE.
¿ORDER BY siempre garantiza el mismo orden para filas idénticas?
No, a menos que especifiques suficientes columnas en ORDER BY para hacer que cada fila sea única en el criterio de ordenación. Si hay filas con valores idénticos en todas las columnas listadas en ORDER BY, su orden relativo es no determinista.
¿Puedo ordenar por una expresión o función en ORDER BY?
Sí, muchos SGBD permiten usar expresiones o funciones (incluyendo subconsultas escalares en algunos casos) directamente en la cláusula ORDER BY. Por ejemplo, podrías ordenar por la longitud de una cadena de texto (
ORDER BY LENGTH(nombre)
) o por el resultado de una operación aritmética.
Conclusión
La cláusula ORDER BY es una herramienta fundamental en SQL que te permite controlar la presentación de tus resultados. Ya sea que necesites ordenar por una columna simple, por valores calculados o por una combinación de múltiples criterios, dominar ORDER BY te proporcionará la capacidad de organizar tus datos de manera significativa y útil. Comprender cómo funciona la ordenación con valores idénticos y NULL, así como la importancia del orden de las columnas en la cláusula, te ayudará a escribir consultas más precisas y predecibles. Practicar con diferentes escenarios te permitirá consolidar estos conceptos y utilizarlos eficazmente en tus propias consultas SQL.
Si quieres conocer otros artículos parecidos a Ordena Datos en SQL con ORDER BY puedes visitar la categoría Bases de datos.

Aprende mas sobre MySQL