Quando você consulta dados de uma tabela, a instrução SELECT
retorna linhas em uma ordem não especificada. Para classificar as linhas do conjunto de resultados, você usa a ORDER BY
cláusula na instrução SELECT
.
A cláusula ORDER BY
permite classificar as linhas retornadas por uma cláusula SELECT
em ordem crescente ou decrescente com base em uma expressão de classificação.
O seguinte sintaxe ilustra a cláusula ORDER BY
:
SELECT
lista_do_select
FROM
nome_da_tabela
ORDER BY
Expressão_de_classificação [ ASC | DESC ],
...
Expressão_de_classificação
[ ASC | DESC ];
Nesta sintaxe:
- Primeiro, especifique uma expressão de classificação, que pode ser uma coluna ou uma expressão, que você deseja classificar após as palavras – chave
ORDER BY
. Se você deseja classificar o conjunto de resultados com base em várias colunas ou expressões, você precisa colocar uma vírgula (,
) entre duas colunas ou expressões para separá-las. - Em segundo lugar, você usa a opção
ASC
para classificar as linhas em ordem crescente e a opçãoDESC
de classificar as linhas em ordem decrescente. Se você omitir a opçãoASC
ouDESC
, oORDER BY
usaASC
por padrão.
PostgreSQL avalia as cláusulas do SELECT
na seguinte ordem: FROM
, SELECT
, e ORDER BY
:

Devido à ordem de avaliação, se você tiver um alias de coluna na cláusula SELECT
, poderá usá-lo na cláusula ORDER BY
.
Vamos dar alguns exemplos de uso da cláusula ORDER BY
no PostgreSQL .
Exemplos de ORDER BY
no PostgreSQL
Usaremos a tabela clientes
no banco de dados de amostra para a demonstração.
1) Usando a cláusula ORDER BY
no PostgreSQL para classificar linhas por uma coluna
A consulta a seguir usa a cláusula ORDER BY
para classificar os clientes por seus nomes em ordem crescente:
SELECT
primeiro_nome,
ultimo_nome
FROM
clientes
ORDER BY
primeiro_nome ASC ;

Como a opção ASC
é o padrão, você pode omiti-la na cláusula ORDER BY
como esta:
SELECT
primeiro_nome,
ultimo_nome
FROM
clientes
ORDER BY
primeiro_nome;

2) Usando a cláusula ORDER BY
no PostgreSQL para classificar as linhas por uma coluna em ordem decrescente
A instrução a seguir seleciona o nome e o sobrenome da tabela clientes
e classifica as linhas por valores na coluna do sobrenome em ordem decrescente:
SELECT
primeiro_nome,
ultimo_nome
FROM
clientes
ORDER BY
ultimo_nome DESC ;

3) Usando a cláusula ORDER BY
no PostgreSQL para classificar linhas por várias colunas
A instrução a seguir seleciona o nome e o sobrenome da tabela do cliente e classifica as linhas pelo nome em ordem crescente e o sobrenome em ordem decrescente:
SELECT
primeiro_nome,
ultimo_nome
FROM
clientes
ORDER BY
primeiro_nome ASC ,
ultimo_nome DESC ;

Neste exemplo, a cláusula ORDER BY classifica as linhas por valores na primeira coluna de nome. E então ele classifica as linhas classificadas por valores na coluna de sobrenome.
Como você pode ver claramente na saída, dois clientes com o mesmo nome Kelly
têm o sobrenome classificado em ordem decrescente.
4) Usando a cláusula ORDER BY
no PostgreSQL para classificar linhas por expressões
A função LENGTH()
aceita uma string e retorna o comprimento dessa string.
A declaração a seguir seleciona os primeiros nomes e seus comprimentos. Ele classifica as linhas pelo comprimento dos primeiros nomes:
SELECT
primeiro_nome,
LENGTH (primeiro_nome) len
FROM
clientes
ORDER BY
len DESC ;

Como a cláusula ORDER BY
é avaliada após a cláusula SELECT
, o alias da coluna len
está disponível e pode ser usado na cláusula ORDER BY
.
Cláusula ORDER BY do PostgreSQL e NULL
No mundo do banco de dados, NULL
é um marcador que indica os dados ausentes ou os dados são desconhecidos no momento da gravação.
Ao classificar linhas que contêm NULL
, você pode especificar a ordem de outros valores NULL
não nulos usando a opção NULLS FIRST
ou NULLS LAST
da cláusula ORDER BY
:
ORDER BY expressão_de_classificação [ASC | DESC] [NULLS FIRST | NULLS LAST]
A opção NULLS FIRST
é colocada antes de outros valores não nulos e a opção NULL LAST
é colocada após outros valores não nulos.
Vamos criar uma tabela para a demonstração.
-- criando nova tabela
CREATE TABLE demo_ordenacao(
num INT
);
-- inserir alguns dados
INSERT INTO demo_ordenacao
( num )
VALUES (1),(2),(3),(null);
Observe que você não precisa entender as instruções CREATE TABLE
e INSERT
. Você só precisa executá-lo pgAdmin
ou psql
e criar a tabela e inserir dados nela.
A consulta a seguir retorna dados da tabela demo_ordenacao:
SELECT num
FROM demo_ordenacao
ORDER BY num ;

Neste exemplo, a cláusula ORDER BY
classifica os valores na coluna num
da tabela demo_ordenacao em ordem crescente. Coloca depois NULL
de outros valores.
Portanto, se você usar a opção ASC
, a cláusula ORDER BY
usará a opção NULLS LAST
por padrão. Portanto, a seguinte consulta retorna o mesmo resultado:
SELECT num
FROM demo_ordenacao
ORDER BY num NULLS LAST ;
Para colocar NULL
antes de outros valores não nulos, você usa a opção NULLS FIRST
:
SELECT num
FROM demo_ordenacao
ORDER BY num NULLS FIRST ;

A instrução a seguir classifica os valores na coluna num
da tabela demor_ordenacao em ordem decrescente:
SELECT num
FROM demo_ordenacao
ORDER BY num DESC ;

Como você pode ver claramente na saída, a cláusula ORDER BY
com a opção DESC
usa o por padrão NULLS FIRST
.
Para inverter a ordem, você pode usar a opção NULLS LAST
:
SELECT num
FROM demo_ordenacao
ORDER BY num DESC NULLS LAST ;
