SQL
Tutorial SQL: Clasificación de resultados con ORDER BY
Aprende a ordenar resultados en SQL con ORDER BY, usando ASC, DESC, orden multicolumna y expresiones para consultas avanzadas.
Aprende SQL y certifícateOrdenación ASC/DESC
La ordenación de resultados es una de las operaciones más comunes y útiles en SQL. Cuando recuperamos datos de una base de datos, a menudo necesitamos que aparezcan en un orden específico para facilitar su análisis o presentación. La cláusula ORDER BY
nos permite controlar exactamente cómo se ordenan los registros en el conjunto de resultados.
Por defecto, cuando utilizamos ORDER BY
con una columna, SQL ordena los resultados en orden ascendente (del valor más bajo al más alto). Sin embargo, podemos modificar explícitamente esta dirección de ordenación utilizando las palabras clave ASC
(ascendente) y DESC
(descendente).
Sintaxis básica
La sintaxis para especificar la dirección de ordenación es:
SELECT columna1, columna2, ...
FROM tabla
ORDER BY columna1 [ASC|DESC];
Donde:
ASC
indica ordenación ascendente (es el valor predeterminado)DESC
indica ordenación descendente
Ordenación ascendente (ASC)
La ordenación ascendente es el comportamiento predeterminado de ORDER BY
. Organiza los datos del valor más bajo al más alto, siguiendo estas reglas:
- Para valores numéricos: del menor al mayor (1, 2, 3...)
- Para texto: orden alfabético (A a Z)
- Para fechas: de la más antigua a la más reciente
- Los valores
NULL
aparecen primero en MySQL y últimos en PostgreSQL
Veamos un ejemplo con una tabla de productos:
SELECT nombre, precio
FROM productos
ORDER BY precio ASC;
Este código ordenará los productos del más barato al más caro. Como ASC
es el valor predeterminado, también podríamos escribirlo así:
SELECT nombre, precio
FROM productos
ORDER BY precio;
Ambas consultas producirían el mismo resultado:
nombre | precio
----------------+--------
Lápiz | 0.75
Cuaderno | 2.50
Bolígrafo | 3.25
Calculadora | 15.99
Tablet | 299.99
Ordenación descendente (DESC)
La ordenación descendente invierte el orden natural, organizando los datos del valor más alto al más bajo:
- Para valores numéricos: del mayor al menor (100, 99, 98...)
- Para texto: orden alfabético inverso (Z a A)
- Para fechas: de la más reciente a la más antigua
- Los valores
NULL
aparecen últimos en MySQL y primeros en PostgreSQL
Para ordenar en sentido descendente, debemos especificar explícitamente la palabra clave DESC
:
SELECT nombre, precio
FROM productos
ORDER BY precio DESC;
Esta consulta mostrará los productos del más caro al más barato:
nombre | precio
----------------+--------
Tablet | 299.99
Calculadora | 15.99
Bolígrafo | 3.25
Cuaderno | 2.50
Lápiz | 0.75
Ejemplos prácticos
Ordenación de datos numéricos
Supongamos que tenemos una tabla de empleados y queremos ver quiénes tienen los salarios más altos:
SELECT nombre, apellido, salario
FROM empleados
ORDER BY salario DESC;
Esta consulta mostrará primero a los empleados con salarios más altos.
Ordenación de texto
Para ordenar clientes alfabéticamente por apellido:
SELECT id_cliente, nombre, apellido
FROM clientes
ORDER BY apellido ASC;
Ordenación de fechas
Para ver los pedidos más recientes primero:
SELECT id_pedido, fecha_pedido, total
FROM pedidos
ORDER BY fecha_pedido DESC;
Comportamiento con valores NULL
Es importante entender cómo se comportan los valores NULL
en la ordenación, ya que varía según el sistema de gestión de bases de datos:
SELECT nombre, fecha_ultima_compra
FROM clientes
ORDER BY fecha_ultima_compra ASC;
En MySQL, los clientes sin fecha de última compra (NULL
) aparecerán primero, mientras que en PostgreSQL aparecerán al final.
Si queremos controlar específicamente dónde aparecen los valores NULL
, podemos usar la cláusula NULLS FIRST
o NULLS LAST
en PostgreSQL:
-- PostgreSQL: forzar que los NULL aparezcan primero
SELECT nombre, fecha_ultima_compra
FROM clientes
ORDER BY fecha_ultima_compra ASC NULLS FIRST;
-- PostgreSQL: forzar que los NULL aparezcan al final
SELECT nombre, fecha_ultima_compra
FROM clientes
ORDER BY fecha_ultima_compra ASC NULLS LAST;
En MySQL, podemos simular este comportamiento usando la función ISNULL()
:
-- MySQL: forzar que los NULL aparezcan al final en ordenación ascendente
SELECT nombre, fecha_ultima_compra
FROM clientes
ORDER BY ISNULL(fecha_ultima_compra), fecha_ultima_compra ASC;
-- MySQL: forzar que los NULL aparezcan primero en ordenación ascendente
SELECT nombre, fecha_ultima_compra
FROM clientes
ORDER BY ISNULL(fecha_ultima_compra) DESC, fecha_ultima_compra ASC;
Consideraciones de rendimiento
La ordenación es una operación que consume recursos del servidor, especialmente con grandes conjuntos de datos. Algunas recomendaciones:
- Crear índices en las columnas que se utilizan frecuentemente para ordenar puede mejorar significativamente el rendimiento.
- Limitar el número de filas con
LIMIT
después de ordenar puede reducir la carga de procesamiento. - Evitar ordenar por columnas calculadas o expresiones complejas cuando sea posible.
-- Más eficiente con un índice en la columna precio
SELECT nombre, precio
FROM productos
ORDER BY precio DESC
LIMIT 10; -- Solo muestra los 10 productos más caros
La ordenación ascendente y descendente es una herramienta fundamental en SQL que nos permite presentar los datos de manera significativa y útil para los usuarios finales, facilitando el análisis y la interpretación de la información almacenada en nuestras bases de datos.
Orden multicolumna
En muchas situaciones prácticas, ordenar los resultados por una sola columna no es suficiente. SQL nos permite establecer criterios de ordenación múltiples mediante la especificación de varias columnas en la cláusula ORDER BY
. Esta funcionalidad es especialmente útil cuando la primera columna de ordenación contiene valores duplicados y necesitamos un criterio adicional para determinar el orden final de los registros.
Cuando utilizamos orden multicolumna, SQL aplica los criterios de ordenación de izquierda a derecha. Esto significa que primero ordena por la primera columna especificada, y cuando encuentra valores iguales, utiliza la segunda columna para determinar el orden entre ellos, y así sucesivamente.
Sintaxis básica
La sintaxis para la ordenación multicolumna es:
SELECT columna1, columna2, ...
FROM tabla
ORDER BY columna1 [ASC|DESC], columna2 [ASC|DESC], ...;
Cada columna en la lista de ORDER BY
puede tener su propia dirección de ordenación (ascendente o descendente).
Ejemplos prácticos
Ordenación por apellido y nombre
Supongamos que tenemos una tabla de estudiantes y queremos ordenarlos alfabéticamente por apellido y, en caso de apellidos iguales, por nombre:
SELECT id_estudiante, nombre, apellido, curso
FROM estudiantes
ORDER BY apellido ASC, nombre ASC;
Resultado:
id_estudiante | nombre | apellido | curso
--------------+----------+-----------+--------
103 | Ana | García | 2B
105 | Carlos | García | 3A
101 | María | López | 1A
104 | Juan | Martínez | 2A
102 | Pedro | Rodríguez | 1B
Observa cómo Ana García aparece antes que Carlos García porque, al tener el mismo apellido, el segundo criterio (nombre) determina el orden.
Combinación de direcciones de ordenación
Podemos combinar ordenaciones ascendentes y descendentes en una misma consulta. Por ejemplo, para mostrar productos ordenados por categoría (alfabéticamente) y dentro de cada categoría, del más caro al más barato:
SELECT nombre, categoria, precio
FROM productos
ORDER BY categoria ASC, precio DESC;
Resultado:
nombre | categoria | precio
----------------+--------------+--------
Teclado gaming | Electrónica | 89.99
Auriculares | Electrónica | 59.99
Mouse | Electrónica | 29.99
Silla ejecutiva | Mobiliario | 199.99
Mesa de oficina | Mobiliario | 149.99
Lámpara de mesa | Mobiliario | 45.50
Casos de uso comunes
Ordenación por fecha y hora
En sistemas que registran eventos, a menudo necesitamos ordenar por fecha y, para eventos del mismo día, por hora:
SELECT id_evento, fecha, hora, descripcion
FROM eventos
ORDER BY fecha ASC, hora ASC;
Ordenación por jerarquía organizacional
Para visualizar empleados por departamento y dentro de cada departamento por nivel jerárquico:
SELECT nombre, departamento, nivel_jerarquico, salario
FROM empleados
ORDER BY departamento ASC, nivel_jerarquico DESC;
Ordenación por relevancia y popularidad
En sistemas de búsqueda, podemos ordenar resultados primero por relevancia y luego por popularidad:
SELECT producto, relevancia_busqueda, num_ventas
FROM resultados_busqueda
WHERE termino_busqueda = 'smartphone'
ORDER BY relevancia_busqueda DESC, num_ventas DESC;
Ordenación por posición de columna
Además de ordenar por nombre de columna, SQL permite ordenar por la posición numérica de la columna en la lista SELECT. Aunque esta práctica no se recomienda para código de producción (reduce la legibilidad), es útil conocerla:
SELECT nombre, apellido, fecha_nacimiento
FROM estudiantes
ORDER BY 2 ASC, 3 DESC;
Esta consulta ordena primero por la segunda columna (apellido) en orden ascendente y luego por la tercera columna (fecha_nacimiento) en orden descendente.
Ordenación con expresiones
También podemos ordenar por el resultado de una expresión. Por ejemplo, para ordenar productos por margen de beneficio:
SELECT nombre, precio_venta, costo, (precio_venta - costo) AS margen
FROM productos
ORDER BY (precio_venta - costo) DESC;
O de forma equivalente:
SELECT nombre, precio_venta, costo, (precio_venta - costo) AS margen
FROM productos
ORDER BY margen DESC;
Consideraciones de rendimiento
La ordenación multicolumna puede afectar al rendimiento, especialmente con grandes conjuntos de datos. Algunas recomendaciones:
- Crear índices compuestos que incluyan todas las columnas utilizadas en la ordenación, en el mismo orden.
- Limitar el número de columnas de ordenación a las estrictamente necesarias.
- Considerar la posibilidad de materializar resultados frecuentes en vistas indexadas.
-- Creación de un índice compuesto para optimizar la ordenación
CREATE INDEX idx_apellido_nombre ON estudiantes(apellido, nombre);
Diferencias entre MySQL y PostgreSQL
Ambos sistemas manejan la ordenación multicolumna de manera similar, pero existen algunas diferencias:
Sensibilidad a mayúsculas/minúsculas: Por defecto, MySQL realiza ordenaciones de texto sin distinguir entre mayúsculas y minúsculas, mientras que PostgreSQL sí las distingue a menos que se especifique lo contrario.
Ordenación de NULL: Como vimos en la sección anterior, MySQL coloca los valores NULL primero en ordenación ascendente, mientras que PostgreSQL los coloca al final por defecto.
-- PostgreSQL: ordenación con control explícito de NULL
SELECT nombre, apellido, fecha_graduacion
FROM estudiantes
ORDER BY apellido ASC,
nombre ASC,
fecha_graduacion DESC NULLS LAST;
La ordenación multicolumna es una herramienta poderosa que nos permite organizar datos de manera jerárquica, reflejando relaciones naturales entre los datos y facilitando su análisis y presentación de forma estructurada y lógica.
Ordenar con expresiones
La cláusula ORDER BY
en SQL no está limitada a ordenar únicamente por columnas existentes en la tabla. Una de sus características más flexibles es la capacidad de ordenar resultados basándose en expresiones calculadas en tiempo de ejecución. Esta funcionalidad permite crear criterios de ordenación personalizados que se adaptan a necesidades específicas de análisis y presentación de datos.
Las expresiones en ORDER BY
pueden incluir operaciones matemáticas, funciones integradas, manipulación de cadenas y conversiones de tipos, entre otras posibilidades. Esto amplía enormemente las opciones de ordenación disponibles más allá de los datos almacenados directamente en la base de datos.
Operaciones matemáticas en ORDER BY
Podemos utilizar operaciones aritméticas básicas para ordenar resultados según cálculos realizados sobre las columnas:
SELECT producto, precio, stock, precio * stock AS valor_inventario
FROM inventario
ORDER BY precio * stock DESC;
Esta consulta ordena los productos por el valor total del inventario (precio multiplicado por cantidad en stock), mostrando primero los productos que representan mayor inversión. Aunque la expresión precio * stock
aparece tanto en la lista SELECT como en ORDER BY, no es necesario que sea así; podríamos ordenar por esta expresión sin incluirla en los resultados.
Funciones de texto
Las funciones de manipulación de texto permiten ordenaciones sofisticadas basadas en partes específicas de cadenas de texto:
SELECT nombre_completo
FROM clientes
ORDER BY SUBSTRING(nombre_completo, POSITION(' ' IN nombre_completo) + 1);
Este ejemplo ordena los clientes por su apellido, extrayendo la parte del nombre que viene después del primer espacio. Es especialmente útil cuando tenemos nombres completos almacenados en un solo campo.
En PostgreSQL, podríamos usar la función split_part()
para lograr el mismo resultado de manera más elegante:
SELECT nombre_completo
FROM clientes
ORDER BY split_part(nombre_completo, ' ', 2);
Funciones de fecha
Las expresiones con fechas permiten ordenaciones basadas en componentes temporales específicos:
SELECT pedido_id, fecha_pedido, cliente
FROM pedidos
ORDER BY EXTRACT(MONTH FROM fecha_pedido), EXTRACT(DAY FROM fecha_pedido);
Esta consulta ordena los pedidos por mes y día, independientemente del año, lo que podría ser útil para analizar patrones estacionales.
Otro ejemplo práctico sería ordenar eventos por día de la semana:
-- En MySQL
SELECT evento, fecha
FROM eventos
ORDER BY DAYOFWEEK(fecha);
-- En PostgreSQL
SELECT evento, fecha
FROM eventos
ORDER BY EXTRACT(DOW FROM fecha);
Expresiones CASE en ORDER BY
Las expresiones CASE proporcionan una forma poderosa de implementar lógica condicional en la ordenación:
SELECT producto, categoria, precio
FROM productos
ORDER BY
CASE
WHEN categoria = 'Electrónica' THEN 1
WHEN categoria = 'Libros' THEN 2
WHEN categoria = 'Ropa' THEN 3
ELSE 4
END,
precio DESC;
Esta consulta ordena los productos primero por una categoría personalizada (con Electrónica primero, luego Libros, después Ropa y finalmente el resto) y dentro de cada categoría, del más caro al más barato.
Las expresiones CASE también son útiles para implementar ordenaciones personalizadas que no siguen un patrón numérico o alfabético estándar:
SELECT nombre, nivel_habilidad
FROM candidatos
ORDER BY
CASE nivel_habilidad
WHEN 'Principiante' THEN 1
WHEN 'Intermedio' THEN 2
WHEN 'Avanzado' THEN 3
WHEN 'Experto' THEN 4
ELSE 5
END DESC;
Funciones de agregación en subconsultas
Aunque no podemos usar funciones de agregación directamente en ORDER BY para la consulta principal, podemos incorporarlas mediante subconsultas:
SELECT c.cliente_id, c.nombre, c.ciudad
FROM clientes c
ORDER BY (
SELECT SUM(p.monto)
FROM pedidos p
WHERE p.cliente_id = c.cliente_id
) DESC;
Esta consulta ordena los clientes según el monto total de sus pedidos, mostrando primero a los clientes que han generado más ingresos.
Expresiones con NULLIF y COALESCE
Estas funciones son particularmente útiles para manejar valores NULL o cero en las ordenaciones:
SELECT producto, ventas_actuales, ventas_previas,
(ventas_actuales - ventas_previas) / NULLIF(ventas_previas, 0) * 100 AS porcentaje_cambio
FROM estadisticas_ventas
ORDER BY (ventas_actuales - ventas_previas) / NULLIF(ventas_previas, 0) * 100 DESC;
La función NULLIF
evita divisiones por cero al convertir los ceros en NULL, permitiendo ordenar por porcentaje de cambio sin errores.
De manera similar, COALESCE
permite proporcionar valores predeterminados para ordenación cuando hay NULL:
SELECT producto, ultima_venta
FROM productos
ORDER BY COALESCE(ultima_venta, '1900-01-01') DESC;
Esta consulta ordena los productos por fecha de última venta, tratando aquellos sin ventas (NULL) como si fueran muy antiguos.
Expresiones con operadores lógicos
Los operadores lógicos permiten ordenaciones basadas en condiciones complejas:
SELECT producto, stock, punto_reorden
FROM inventario
ORDER BY stock <= punto_reorden DESC, stock ASC;
Esta consulta muestra primero los productos que necesitan reabastecimiento (stock menor o igual al punto de reorden) y los ordena de menor a mayor stock, priorizando así los más urgentes.
Consideraciones de rendimiento
Las ordenaciones basadas en expresiones pueden afectar al rendimiento, ya que:
- La base de datos debe calcular la expresión para cada fila antes de ordenar.
- No se pueden utilizar índices directamente para optimizar la ordenación.
Para mejorar el rendimiento:
- Considerar la creación de columnas calculadas o índices funcionales (en bases de datos que los soporten) para expresiones utilizadas frecuentemente.
- En PostgreSQL, se pueden crear índices sobre expresiones:
CREATE INDEX idx_apellido_extraido ON clientes (split_part(nombre_completo, ' ', 2));
- Evaluar si es posible precalcular los valores en lugar de calcularlos en cada consulta.
Compatibilidad entre sistemas
La mayoría de las expresiones funcionan de manera similar en MySQL y PostgreSQL, pero existen algunas diferencias en las funciones disponibles y su sintaxis:
- Para extraer partes de fechas, MySQL usa funciones como
MONTH()
,YEAR()
, mientras que PostgreSQL prefiereEXTRACT(MONTH FROM fecha)
. - Para manipulación de cadenas, PostgreSQL ofrece funciones como
split_part()
que no están disponibles en MySQL.
Es recomendable consultar la documentación específica de cada sistema para aprovechar al máximo sus capacidades.
La ordenación mediante expresiones es una herramienta extremadamente versátil que permite adaptar la presentación de datos a necesidades específicas de análisis y visualización, superando las limitaciones de los datos almacenados directamente en la base de datos. Dominar esta técnica permite crear consultas más sofisticadas y útiles para los usuarios finales.
Otros ejercicios de programación de SQL
Evalúa tus conocimientos de esta lección Clasificación de resultados con ORDER BY con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Tipos de datos
Inserción de datos: INSERT INTO
Filtrado de grupos de resultados con HAVING
Uso de índices y particiones
Renombrar tablas y bases de datos: RENAME
Uso de vistas
Uso de INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN
Agrupación de resultados con GROUP BY
Creación y uso de subqueries
Sentencias INSERT
Copias de seguridad y restauración de bases de datos
Uso de INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN
Instalación de MySQL
Relaciones entre tablas
Eliminación de datos: DELETE
Creación de bases de datos y tablas: CREATE DATABASE, CREATE TABLE
Creación y uso de funciones
Creación de tablas e inserción de datos con SQL
Uso de funciones agregadas: COUNT, SUM, AVG, MAX, MIN
Optimización de consultas
Introducción a SQL
Triggers y eventos
Clasificación de resultados con ORDER BY
Alterar la estructura de tablas existentes: ALTER TABLE
Eliminación de datos: DELETE
Instalación de PostgreSQL
Creación y uso de procedimientos almacenados
Consultas básicas de selección: SELECT y WHERE
Vaciar tablas y bases de datos: DROP
Actualización de datos: UPDATE
Creación y manejo de usuarios y roles
Consultas básicas de selección SELECT y WHERE
Creación de bases de datos y tablas
Bases de datos y tablas
Actualización de datos: UPDATE
Relaciones entre tablas
Filtrado de valores únicos con DISTINCT
Asignación y gestión de permisos
Todas las lecciones de SQL
Accede a todas las lecciones de SQL y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Sql
Introducción Y Entorno
Ddl Y Dml
Introducción Y Entorno
Instalación De Mysql
Introducción Y Entorno
Instalación De Postgresql
Introducción Y Entorno
Tipos De Datos
Introducción Y Entorno
Bases De Datos Y Tablas
Introducción Y Entorno
Sistemas De Gestión De Bases De Datos
Introducción Y Entorno
Tipos De Bases De Datos
Introducción Y Entorno
Creación De Bases De Datos Y Tablas: Create Database, Create Table
Sintaxis Dml Crud
Consultas Básicas De Selección: Select Y Where
Sintaxis Dml Crud
Inserción De Datos: Insert Into
Sintaxis Dml Crud
Actualización De Datos: Update
Sintaxis Dml Crud
Eliminación De Datos: Delete
Sintaxis Dml Crud
Introducción A Dml
Sintaxis Dml Crud
Consultar Datos: Select
Sintaxis Dml Crud
Clasificación De Resultados Con Order By
Filtros Y Clasificación
Filtrado De Valores Únicos Con Distinct
Filtros Y Clasificación
Paginación Con Limit Y Offset
Filtros Y Clasificación
Alterar La Estructura De Tablas Existentes: Alter Table
Sintaxis Ddl
Renombrar Tablas Y Bases De Datos: Rename
Sintaxis Ddl
Vaciar Tablas Y Bases De Datos: Drop
Sintaxis Ddl
Uso De Funciones Agregadas: Count, Sum, Avg, Max, Min
Funciones Y Agrupación
Agrupación De Resultados Con Group By
Funciones Y Agrupación
Filtrado De Grupos De Resultados Con Having
Funciones Y Agrupación
Funciones Numéricas Y Matemáticas
Funciones Y Agrupación
Funciones De Fecha Y Hora
Funciones Y Agrupación
Funciones De Texto
Funciones Y Agrupación
Many To One
Asociaciones Entre Tablas
One To Many
Asociaciones Entre Tablas
One To One
Asociaciones Entre Tablas
Many To Many
Asociaciones Entre Tablas
Relaciones Entre Tablas
Joins Y Subqueries
Uso De Inner Join, Left Join, Right Join, Full Join
Joins Y Subqueries
Creación Y Uso De Subqueries
Joins Y Subqueries
Left Join Y Right Join
Joins Y Subqueries
Full Join
Joins Y Subqueries
Cross Join Y Self Join
Joins Y Subqueries
Optimización De Consultas
Sintaxis Avanzada
Uso De Índices Y Particiones
Sintaxis Avanzada
Uso De Vistas
Sintaxis Avanzada
Triggers Y Eventos
Sintaxis Avanzada
Particiones
Sintaxis Avanzada
Restricciones E Integridad
Sintaxis Avanzada
Transacciones
Sintaxis Avanzada
Vistas Materializadas
Sintaxis Avanzada
Rollback
Sintaxis Avanzada
Vistas Con Create View
Sintaxis Avanzada
Principios Acid
Sintaxis Avanzada
Manejo De Errores Y Excepciones
Sintaxis Avanzada
Funciones Ventana
Sintaxis Avanzada
Índices
Sintaxis Avanzada
Expresiones De Tabla Comunes (Cte) Con With
Sintaxis Avanzada
Creación Y Uso De Funciones
Programación En Sql
Creación Y Uso De Procedimientos Almacenados
Programación En Sql
Variables Y Control De Flujo
Programación En Sql
Creación Y Manejo De Usuarios Y Roles
Seguridad Y Administración
Asignación Y Gestión De Permisos
Seguridad Y Administración
Copias De Seguridad Y Restauración De Bases De Datos
Seguridad Y Administración
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender la sintaxis y uso básico de ORDER BY para ordenar resultados en orden ascendente y descendente.
- Aprender a ordenar resultados por múltiples columnas con diferentes criterios y direcciones.
- Conocer cómo ordenar resultados utilizando expresiones y funciones en la cláusula ORDER BY.
- Entender el comportamiento de los valores NULL en la ordenación y cómo controlarlos.
- Identificar consideraciones de rendimiento y buenas prácticas al ordenar grandes conjuntos de datos.