Ir al contenido principal

Clausula ORDER BY en PostgreSQL

Los resultados devueltos por una consulta con SELECT generalmente no guardan un orden específico. La clausula ORDER BY ofrece la posibilidad de ordenar los resultados de una consulta siguiendo unos criterios definidos.

La sintaxis de la clausula ORDER BY es como sigue:

SELECT
    lista_de_columnas
FROM
    tabla
ORDER BY
    expresión_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
    ...
    expresión_n [ASC | DESC] [NULLS FIRST | NULLS LAST]

Como puedes ver, para cada expresión de ordenación, se puede definir el orden, ASC para ascendente y DESC para descendente. Si se omite el orden, entonces se usará ASC por defecto. Cada una de las expresiones de ordenación debe separarse de una coma (,), pues se trata de una lista.

Las opciones [NULLS FIRST | NULLS LAST] hacen referencia al modo en que serán tratados los valores nulos.

A continuación se muestran algunos ejemplo de uso de la clausula ORDER BY.

Ordenar una consulta por una columna

Uno de los ejemplos mínimos del uso de la clausula ORDER BY es la ordenación de los resultados por una sola columna. Veamos el siguiente ejemplo:

SELECT 
    ship_name, 
    ship_address, 
    ship_city 
FROM 
    orders 
ORDER BY 
    ship_name ASC;

El resultado devuelto por esta consulta esta ordenado por ship_name:

s1-order-by-1.png

La consulta a continuación es análoga a la anterior y produce el mismo resultado:

SELECT 
    ship_name, 
    ship_address, 
    ship_city 
FROM 
    orders 
ORDER BY 
    ship_name;

Recordemos que si omitimos los complementos ASC y DESC en la clausula ORDER BY por defecto se usará ASC por defecto.

Del mismo modo, si definimos el ordenamiento en DESC, los resultados se ordenarán en sentido descendente:

SELECT 
    ship_name, 
    ship_address, 
    ship_city 
FROM 
    orders 
ORDER BY 
    ship_name DESC;

La consulta anterior produce el siguiente resultado:

s1-order-by-2.png

Ordenar una consulta por múltiples columnas

La clausula ORDER BY puede ordenar los resultados por múltiples columnas. Para ello la clausula ORDER BY acepta una lista de columnas para ordenar. Veamos un ejemplo:

SELECT 
    ship_name, 
    ship_address, 
    ship_city, 
    shipped_date 
FROM 
    orders
ORDER BY 
    ship_name DESC, 
    shipped_date ASC;

Cuyo resultado es como sigue:

s1-order-by-3.png

En este ejemplo, hemos ordenado, en primer lugar todos los resultados por la columna ship_name en orden descendente. A continuación, todos los resultados que tienen el mismo valor, son ordenados a su vez por la columna shipped_date en orden ascendente.

Esto significa que la clausula ORDER BY, realiza la ordenación por grupos de igual valor en la columnas, según el orden en el que aparecen en la lista de izquierda a derecha.

Ordenar una consulta usando expresiones

La clausula ORDER BY puede también ordenar el resultado de una expresión. Un ejemplo puede ser el uso de la función LENGTH() y ordenar por la longitud de la cadena:

SELECT 
    ship_name, 
    ship_address, 
    ship_city, 
    LENGTH(ship_name) longitud
FROM 
    orders
ORDER BY 
    longitud ASC;

El resultado obtenido es el siguiente:

s1-order-by-4.png

Ordenación de columnas con valores nulos

Dentro de PostgreSQL un valor nulo representa el estado de una celda cuyo valor no ha sido definido o es desconocido en un momento dado. La opción de tratamiento de valores nulos permite definir el modo en el que queremos que los valores nulos sean tratados. Tenemos dos opciones, NULLS FIRST ordenará los resultados con valores nulos primero y NULLS LAST los posicionará al final de los resultados. En el caso que la opción de nulos se omita, por defecto se usa NULLS FIRST.

Vamos a crear una tabla e insertar unos registros para entender mejor la ordenación de nulos:

CREATE TABLE demo_nulos (numero INT);

INSERT INTO demo_nulos(numero) VALUES (11),(22),(33),(44),(null);

Veamos el resultado de un primer ejemplo, en el que ordenamos los resultados de tal forma que los nulos sean posicionados al final:

SELECT numero FROM demo_nulos ORDER BY numero ASC NULLS LAST;

Cuyo resultado será:

s1-order-by-5.png

Ahora vamos a modificar la consulta para posicionar los nulos al inicio de los resultados:

SELECT numero FROM demo_nulos ORDER BY numero ASC NULLS FIRST;

s1-order-by-6.png