7.5. Ordenação de linhas (ORDER BY) #

Após a consulta ter produzido a tabela de saída (após a lista de seleção ter sido processada) essa tabela pode, opcionalmente, ser ordenada. Se nenhuma ordenação for especificada, as linhas retornam em uma ordem aleatória. Nesse caso, a ordem real depende dos tipos de plano de varredura e de junção e da ordem no disco, mas não se deve confiar nisto. Uma ordem de saída específica só pode ser garantida se a etapa de ordenação for escolhida explicitamente.

A cláusula ORDER BY especifica a ordem de classificação:

SELECT lista_de_seleção
    FROM expressão_de_tabela
    ORDER BY expressão_de_ordenação1 [ASC | DESC] [NULLS { FIRST | LAST }]
             [, expressão_de_ordenação2 [ASC | DESC] [NULLS { FIRST | LAST }] ...]

A(s) expressão(ões) de ordenação pode(m) ser qualquer expressão que seja válida na lista de seleção da consulta. Um exemplo é:

SELECT a, b FROM tabela1 ORDER BY a + b, c;

Quando é especificada mais de uma expressão, os valores posteriores são usados para classificar as linhas iguais segundo os valores anteriores. Cada expressão pode ser seguida pela palavra-chave opcional ASC ou DESC, para definir a direção da ordenação como ascendente ou descendente. ASC é a ordem padrão. A ordem ascendente coloca os valores menores em primeiro lugar, onde menor é definido em termos do operador <. Da mesma forma, a ordem descendente é determinada pelo operador >. [41]

As opções NULLS FIRST e NULLS LAST podem ser usadas para determinar se os nulos aparecem antes ou depois dos valores não nulos na ordem de classificação. Por padrão, os valores nulos são classificados como sendo maiores que qualquer valor não nulo; ou seja, NULLS FIRST é o padrão para a ordem DESC e NULLS LAST caso contrário.

Repare que as opções de ordenação são consideradas de forma independente para cada coluna de classificação. Por exemplo, ORDER BY x, y DESC significa ORDER BY x ASC, y DESC, que não é idêntico a ORDER BY x DESC, y DESC.

Uma expressão_de_ordenação também pode ser o rótulo da coluna ou o número da coluna de saída, como em

SELECT a + b AS sum, c FROM tabela1 ORDER BY sum;
SELECT a, max(b) FROM tabela1 GROUP BY a ORDER BY 1;

onde ambas estão ordenadas pela primeira coluna de saída. Note que o nome da coluna de saída tem que ficar sozinho, ou seja, não pode ser usado em uma expressão — por exemplo, isto não é correto:

SELECT a + b AS sum, c FROM tabela1 ORDER BY sum + c;          -- errado

Essa restrição é feita para reduzir a ambiguidade. Ainda haverá ambiguidade se um item do ORDER BY for um nome simples que poderia corresponder tanto a um nome de coluna de saída quanto a uma coluna da expressão de tabela. Em tais casos é usada a coluna de saída. Isto só causaria confusão se fosse usado AS para renomear uma coluna de saída que corresponda ao nome de alguma outra coluna da tabela.

ORDER BY pode ser aplicado ao resultado de uma combinação de UNION, INTERSECT, ou EXCEPT, mas neste caso só é permitido classificar pelos nomes ou números das colunas, e não por expressões.



[41] Na verdade, o PostgreSQL utiliza a classe de operadores de árvore B padrão para o tipo de dados da expressão, para determinar a ordem de classificação com ASC e DESC. Por convenção, os tipos de dados são configurados para que os operadores < e > correspondam a essa ordem de classificação, mas o projetista de um tipo de dados definido pelo usuário pode optar por fazer algo diferente.