ORDER BY
)Après qu'une requête a produit une table en sortie (après que la liste de sélection a été traitée), elle peut être optionnellement triée. Si le tri n'a pas été choisi, les lignes sont renvoyées dans un ordre non spécifié. Dans ce cas, l'ordre réel dépendra des types de plan de parcours et de jointure et de l'ordre sur le disque, mais vous ne devez pas vous y fier. Un tri particulier en sortie peut seulement être garanti si l'étape de tri est choisie explicitement.
La clause ORDER BY
spécifie l'ordre de tri :
SELECTliste_selection
FROMexpression_table
ORDER BYexpression_tri1
[ASC | DESC] [NULLS { FIRST | LAST }] [,expression_tri2
[ASC | DESC] [NULLS { FIRST | LAST }] ...]
Les expressions de tri peuvent être toute expression qui serait valide dans la liste de sélection des requêtes. Voici un exemple :
SELECT a, b FROM table1 ORDER BY a + b, c;
Quand plus d'une expression est indiquée, les valeurs suivantes sont
utilisées pour trier les lignes qui sont identiques aux valeurs précédentes.
Chaque expression pourrait être suivie d'un
ASC
ou DESC
optionnel pour configurer la
direction du tri (ascendant ou descendant). L'ordre ASC
est la
valeur par défaut. L'ordre ascendant place les plus petites valeurs en
premier, où « plus petit » est défini avec l'opérateur
<
. De façon similaire, l'ordre descendant est
déterminé avec l'opérateur >
.
[6]
Les options NULLS FIRST
et NULLS LAST
sont utilisées pour déterminer si les valeurs NULL apparaissent avant ou
après les valeurs non NULL après un tri. Par défaut, les valeurs NULL sont
triées comme si elles étaient plus grandes que toute valeur non NULL.
Autrement dit, NULLS FIRST
est la valeur par défaut pour
l'ordre descendant (DESC
) et NULLS LAST
est la valeur utilisée sinon.
Notez que les options de tri sont considérées indépendamment pour chaque
colonne triée. Par exemple, ORDER BY x, y DESC
signifie
en fait ORDER BY x ASC, y DESC
, ce qui est différent de
ORDER BY x DESC, y DESC
.
Une expression_tri
peut aussi être, à la place,
le nom ou le numéro d'une colonne en sortie, par exemple :
SELECT a + b AS sum, c FROM table1 ORDER BY sum; SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;
les deux triant par la première colonne en sortie. Notez qu'un nom de colonne en sortie doit être unique, il ne doit pas être utilisé dans une expression -- par exemple, ceci n'est pas correct :
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- mauvais
Cette restriction est là pour réduire l'ambiguïté. Il y en a toujours si un
élément ORDER BY
est un simple nom qui pourrait
correspondre soit à un nom de colonne en sortie soit à une colonne d'une
expression de table. La colonne en sortie est utilisée dans de tels cas.
Cela causera seulement de la confusion si vous utilisez AS
pour renommer une colonne en sortie qui correspondra à un autre nom de
colonne d'une table.
ORDER BY
peut être appliqué au résultat d'une combinaison
UNION
, d'une combinaisonINTERSECT
ou
d'une combinaison EXCEPT
, mais, dans ce cas, il est
seulement permis de trier par les noms ou numéros de colonnes, pas par les
expressions.
[6]
En fait, PostgreSQL utilise la classe
d'opérateur B-tree par défaut pour le type de données de
l'expression pour déterminer l'ordre de tri avec ASC
et DESC
.
De façon conventionnelle, les types de données seront initialisés de
façon à ce que les opérateurs <
et
>
correspondent à cet ordre de tri, mais un
concepteur des types de données définis par l'utilisateur pourrait choisir
de faire quelque chose de différent.