CodeGym /Cursos /SQL SELF /Ordenación por varias columnas: orden y prioridades

Ordenación por varias columnas: orden y prioridades

SQL SELF
Nivel 6 , Lección 2
Disponible

Imagina que estás currando con una base de datos enorme de estudiantes. Ordenarlos solo por apellidos ya mola, pero piensa que en tu tabla hay estudiantes con el mismo apellido. En ese caso, para que el resultado sea más legible, puedes añadir la ordenación por nombre. O por ejemplo: quieres ordenar una lista de pedidos primero por fecha y luego por el total del pedido. Y aquí es donde entra la ordenación por varias columnas.

La ordenación por varias columnas te permite: 1. Organizar los datos en un orden bien definido; 2. Controlar las prioridades de ordenación (primero por una columna, luego por otra); 3. Mostrar los datos de forma más estructurada y fácil de leer.

Sintaxis de ordenación por varias columnas

Para ordenar datos por varias columnas, se usa el conocido operador ORDER BY, pero ahora listamos varias columnas separadas por comas. PostgreSQL ordena primero por la primera columna, luego (si hay valores iguales) por la segunda, y así sucesivamente.

Aquí va la sintaxis general:

SELECT columnas
FROM tabla
ORDER BY columna1 direccion1,  columna2 direccion2, ... ;

Dónde:

  • columna1, columna2, ... — son las columnas por las que quieres ordenar.
  • direccion1, direccion2, ... — es la dirección de la ordenación (ASC — ascendente, DESC — descendente).
  • Este parámetro es opcional, por defecto se usa ASC.

Ejemplo 1: Ordenar estudiantes por apellido y luego por nombre

Imagina la tabla students con datos de estudiantes:

id first_name last_name age
1 Anna Lin 20
2 Victor Lin 22
3 Maria Kim 21
4 Otto Lin 23
5 Anna Kim 20

La tarea es ordenar los estudiantes primero por apellido (last_name), y luego por nombre (first_name).

SELECT id, first_name, last_name, age
FROM students
ORDER BY last_name ASC, first_name ASC;

Resultado:

id first_name last_name age
5 Anna Kim 20
3 Maria Kim 21
1 Anna Lin 20
4 Otto Lin 23
2 Victor Lin 22

Como ves, las filas están ordenadas primero por apellido (Kim, luego Lin), y después por nombre (Anna, Maria, etc.). Esto es súper útil cuando necesitas encontrar rápido a alguien en la lista o para ordenar un registro.

Ejemplo 2: Ordenar pedidos por fecha y total

Imagina la tabla orders con datos de pedidos:

order_id customer_id order_date total
1 101 2025-10-01 500
2 102 2025-10-03 200
3 103 2025-10-02 300
4 104 2025-10-01 100
5 101 2025-10-03 600

Queremos ordenar los pedidos primero por la fecha order_date, y luego por el total del pedido total en orden descendente.

Consulta SQL:

SELECT order_id, customer_id, order_date, total
FROM orders
ORDER BY order_date ASC, total DESC;

Resultado:

order_id customer_id order_date total
1 101 2025-10-01 500
4 104 2025-10-01 100
3 103 2025-10-02 300
5 101 2025-10-03 600
2 102 2025-10-03 200

Como ves, los pedidos con la misma fecha también se ordenan por el total.

Trabajando con NULL al ordenar: NULLS FIRST y NULLS LAST

En SQL hay un valor especial - NULL, que significa que no hay valor. Más adelante veremos cómo trabajar con él, pero ahora es buen momento para mostrar cómo puedes gestionarlo al ordenar.

Cuando ordenas columnas que contienen NULL, PostgreSQL tiene que decidir dónde poner los valores vacíos: al principio o al final.

Por defecto:

  • Con ORDER BY ... ASC: NULL van al final (NULLS LAST)
  • Con ORDER BY ... DESC: NULL van al principio (NULLS FIRST)

A veces este comportamiento no mola — y puedes controlarlo explícitamente usando NULLS FIRST o NULLS LAST.

Sintaxis:

ORDER BY columna ASC NULLS FIRST
ORDER BY columna DESC NULLS LAST

Ejemplo: ordenar por notas, donde NULL — "nota aún no puesta"

SELECT student_id, grade
FROM grades
ORDER BY grade DESC NULLS LAST;

Así primero salen los mejores estudiantes, luego los más flojos, y al final del todo — los que aún no tienen nota (NULL).

Ejemplo: al revés — mostrar primero los estudiantes sin nota

Supón que tienes la tabla grades, donde algunos estudiantes aún no tienen nota (NULL):

student_id grade
101 NULL
102 85
103 NULL
104 92
105 76

Queremos mostrar primero los estudiantes sin nota, y luego el resto en orden ascendente de notas.

SELECT student_id, grade
FROM grades
ORDER BY grade ASC NULLS FIRST;

Resultado:

student_id grade
101 NULL
103 NULL
105 76
102 85
104 92

El operador NULLS FIRST junto con ORDER BY grade ASC asegura que los registros con NULL estén al principio, y luego las notas en orden ascendente.

Sobre peculiaridades y errores típicos

La peña que empieza suele olvidar poner la dirección de ordenación para cada columna. Si no la pones, PostgreSQL usa ASC por defecto. También es típico olvidar que el orden de las columnas en ORDER BY importa: primero se ordenan los datos por la primera columna, y solo después se aplica la ordenación por la segunda si los valores de la primera son iguales.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION