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:
SELECTlista_de_seleçãoFROMexpressão_de_tabelaORDER BYexpressã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.