En este articulo aprenderemos a ordenar registros con ORDER BY en PostgreSQL. Cuando realizamos una consulta (select), la herramienta nos devuelve los registros sin ningún orden especifico, pero podemos ordenarlos usando la cláusula order by.
La cláusula order by nos permite ordenar las filas devueltas por la cláusula select en orden ascendente o descendente en función de una expresión.
Sintaxis
SELECT campos FROM tabla ORDER BY expresión1 [ASC | DESC], ... expresiónN [ASC | DESC];
En esta sintaxis:
- Primero, escribes una expresión, que puede ser una columna de la tabla o una expresión, después de la palabra clave order by. Si quieres ordenar el conjunto de resultados en función de varias columnas o expresiones, tienes que escribir una coma (,) entre dos columnas o expresiones para separarlas.
- En segundo lugar, escribes ASC o DESC después de cada campo o expresión para indicarle si debe ordenar de forma ascendente o descendente. Si se omite, ordenara de forma ascendente.
Cuando ejecutas una consulta en PostgreSQL que contiene las cláusulas select, from y order by la herramienta no las evalúa en ese orden, sino que primero evalúa el from, después el select y por último la cláusula order by.

Este orden es importante porque si utilizas un alias en el select podrás reutilizarlo en la cláusula de ordenación order by.
Ejemplos
Ordenar por un campo
En el siguiente ejemplo ordenamos los registros por el campo id_empleado de la tabla empleados. Al no especificarle si lo debe hacer en orden ascendente o descendente, automáticamente lo hace en orden ascendente. Observa ademas que aunque el campo id_empleado no esta en el select se puede ordenar por él.
select * from empleados order by id_empleado;

Ordenar por dos campos con orden diferente
En el siguiente ejemplo ordenamos los registros por los campos ventas en orden descendente y sueldo en orden ascendente de la tabla empleados. Haciendo esta ordenación podemos interpretar los resultados viendo que el que menos sueldo tiene es el que más ha vendido y entre los que han vendido menos hay un empleado que cobra menos que otro.
select nombre, sueldo, ventas from empleados order by ventas desc, sueldo asc;

Ordenar por una expresión
En el siguiente ejemplo ordenamos los registros utilizando la expresión lenght(nombre), es decir por el conteo de letras del campo nombre. Aunque en este ejemplo también se ha utilizado en la cláusula select no es necesario para utilizarlo como orden.
select nombre, length(nombre) as LONGITUD from empleados order by length(nombre) desc;

Ordenar por posición
En el siguiente ejemplo ordenamos los registros utilizando la posición de cada campo en función de cómo se han escrito en la cláusula select. Este método no es muy utilizado, sobretodo en consultas muy largas por su difícil compresión en un solo vistazo, ya que para saber porque se ha ordenado te obliga a ir a la cláusula select y ver el campo.
select nombre, sueldo, ventas from empleados order by 2 asc, 3 desc;

Ordenar teniendo en cuenta los nulos
Otra opción que tenemos es decidiendo que hacemos con los nulos, ademas de todo lo visto anteriormente, podemos decidir si queremos que los nulos se muestren primero (nulls first) o si queremos que se muestren al final (nulls last). En el siguiente ejemplo ordenamos el campo ventas en orden descendente pero mostrando los nulos primero.
Sino utilizas la opción para controlar el orden de los nulos, al utilizar el orden asc los colocara al final por defecto y si utilizas la opción desc los colocara al principio.
select * from empleados order by ventas desc nulls first;

Ejemplo completo
Copia y pega el siguiente código en tu consola de PostgreSQL y realiza paso a paso leyendo los comentarios:
-- Creamos la tabla si no existe CREATE TABLE IF NOT EXISTS empleados ( id_empleado numeric(2,0), nombre character varying(50), puesto character varying(50), sueldo integer, ventas integer, ingresos numeric(5,2) ); -- Insertamos los registros INSERT INTO empleados (id_empleado, nombre, puesto, sueldo, ventas, ingresos) values (1, 'Miguel Troyano','Analista',3000,36,5.80) , (2, 'Ismael Troyano','Responsable',4000,36,5.88) , (3, 'Pilar Redondo','Responsable',1500,51,5.89) ; -- Ordenamos por el campo id_empleado select * from empleados order by id_empleado; -- Ordenamos por dos campos, uno descendente y otro ascendente select nombre, sueldo, ventas from empleados order by ventas desc, sueldo asc; -- Ordenamos por una expresión select nombre, length(nombre) as LONGITUD from empleados order by length(nombre) desc; -- Ordenamos utilizando la posición del campo en el select select nombre, sueldo, ventas from empleados order by 2 asc, 3 desc; -- Ordenamos indicando donde debe posicionar los nulos select * from empleados order by ventas desc nulls first;