Ordenar registros con ORDER BY en PostgreSQL

En este artículo aprenderemos a ordenar registros con ORDER BY en PostgreSQL. Cuando realizamos una consulta (select), la herramienta nos devuelve los registros sin ningún orden específico, 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 reutilizarlos 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 especificarse si lo debe hacer en orden ascendente o descendente, automáticamente lo hace en orden ascendente. Observa además que aunque el campo id_empleado no está en el select se puede ordenar por él.

select * 
from empleados
order by id_empleado;
Ordenar registros con ORDER BY en PostgreSQL

Ordenar por dos campos con orden diferente

En el siguiente ejemplo ordenamos los registros por los campos sueldo en orden ascendente y nombre en orden descendente de la tabla empleados. Haciendo esta ordenación primero obtenemos el sueldo más bajo y si alguno tiene el mismo sueldo lo ordenamos por nombre descendente y así sucesivamente por cada sueldo…

select nombre, sueldo
from empleados
order by sueldo asc, nombre desc;

Ordenar por una expresión

En el siguiente ejemplo ordenamos los registros utilizando la expresión length(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 comprensió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 id_empleado, nombre, sueldo
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, además de todo lo visto anteriormente, podemos decidir si queremos que los nulos se muestren primero (nulls first) o si queremos que se visualicen al final (nulls last). En el siguiente ejemplo ordenamos el campo ventas en orden descendente pero mostrando los nulos primero.

Si no 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 sueldo 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 ascendente y otro descendente 
select nombre, sueldo
from empleados
order by sueldo asc, nombre desc;

-- 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 id_empleado, nombre, sueldo
from empleados
order by 2 asc, 3 desc;

-- Ordenamos indicando donde debe posicionar los nulos
select *
from empleados
order by sueldo desc nulls first;

Escribir un comentario

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.