Tiempo de lectura:3 Minutos, 52 Segundos

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;

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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

Perfiles en Redes Sociales