Ordenar registros con ORDER BY en Oracle

En este artículo aprenderemos a ordenar registros con ORDER BY en Oracle. 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 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 registros con ORDER BY en Oracle

Ordenar por dos campos con orden diferente

En el siguiente ejemplo ordenamos los registros por el campo sueldo en orden descendente y dentro de ese resultado ordenamos por nombre en orden ascendente de la tabla empleados.

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

Ordenar por una expresión

En el siguiente ejemplo ordenamos los registros utilizando la expresión lenght(nombre), es decir, por la longitud del campo del 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 nombre, puesto, 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, 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:

-- www.MiguelTroyano.com
-- Borramos la tabla si existe
drop table empleados;

-- Creamos la tabla
create table empleados
(
    id_empleado numeric(2,0),
    id_departamento numeric(2,0),
    nombre character varying(50),
    puesto character varying(50),
    fecha_alta date,
    sueldo integer
);

-- Insertamos valores
insert into empleados values (1,1,'Miguel Troyano','Analista',to_date('26/09/1986','DD/MM/YYYY'),60000);
insert into empleados values (2,1,'Ismael Troyano','Analista',to_date('01/01/2001','DD/MM/YYYY'),60000);
insert into empleados values (3,1,'Jose Troyano','Alta Dirección',to_date('01/01/2001','DD/MM/YYYY'),80000);
insert into empleados values (4,1,'Pilar Redondo','Alta Dirección',to_date('02/02/2002','DD/MM/YYYY'),80000);

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

-- Ordenamos indicando donde debe posicionar los nulos
select *
from empleados
order by ventas 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.