- Catégories :
ORDER BY¶
Spécifie un classement des lignes de la table de résultats à partir d’une liste SELECT.
Syntaxe¶
SELECT ...
FROM ...
ORDER BY orderItem [ , orderItem , ... ]
[ ... ]
Où :
orderItem ::= { <column_alias> | <position> | <expr> } [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
Paramètres¶
column_alias
Alias de colonne figurant dans la liste SELECT du bloc de requête.
position
Position d’une expression dans la liste SELECT.
expr
Toute expression sur les tables du périmètre actuel.
{ ASC | DESC }
Renvoie éventuellement les valeurs de la clé de tri par ordre croissant (du plus petit au plus grand) ou décroissant (du plus grand au plus petit).
Par défaut : ASC
NULLS { FIRST | LAST }
Spécifie éventuellement les valeurs NULL renvoyées avant / après les valeurs non NULL, en fonction de l’ordre de tri (ASC ou DESC).
Par défaut : dépend de l’ordre de tri (ASC ou DESC) ; voir les notes sur l’utilisation ci-dessous pour plus de détails
Notes sur l’utilisation¶
Toutes les données sont triées en fonction de la valeur d’octet numérique de chaque caractère de la table ASCII. Le codage UTF-8 est pris en charge.
Pour les valeurs numériques, les zéros de tête avant la virgule décimale et les zéros de fin (
0
) après la virgule décimale n’ont aucun effet sur l’ordre de tri.Lorsque NULLS FIRST ou NULLS LAST n’est pas spécifié, l’ordre des valeurs NULL dépend du paramètre DEFAULT_NULL_ORDERING et de l’ordre de tri :
Lorsque l’ordre de tri est ASC (par défaut) et que le paramètre DEFAULT_NULL_ORDERING est défini avec
LAST
(par défaut), les valeurs NULL sont renvoyées en dernier. Par conséquent, sauf indication contraire, les valeurs NULL sont considérées comme plus élevées que toutes les valeurs autres que NULL.Lorsque l’ordre de tri est ASC et que le paramètre DEFAULT_NULL_ORDERING est défini avec
FIRST
, les valeurs NULL sont retournées en premier.Lorsque l’ordre de tri est DESC et que le paramètre DEFAULT_NULL_ORDERING est défini avec
FIRST
, les valeurs NULL sont retournées en dernier.Lorsque l’ordre de tri est DESC et que le paramètre DEFAULT_NULL_ORDERING est défini avec
LAST
, les valeurs NULL sont retournées en premier.
La cohérence de l’ordre de tri n’est pas garantie pour les valeurs de types de données différents dans les données semi-structurées, comme un tableau qui contient des éléments de types de données différents.
L’élagage Top-K peut améliorer les performances des requêtes qui comprennent à la fois les clauses LIMIT et ORDER BY. Pour plus d’informations, voir Élagage des K premiers résultats pour améliorer la performance des requêtes.
Un ORDER BY peut être utilisé à différents niveaux dans une requête, par exemple dans une sous-requête ou dans une sous-clause OVER(). Un ORDER BY à l’intérieur d’une sous-requête ou d’une sous-clause s’applique uniquement dans cette sous-requête ou sous-clause. Par exemple, le ORDER BY dans la requête suivante demande uniquement des résultats dans la sous-requête et non dans le niveau externe de la requête :
SELECT * FROM ( SELECT branch_name FROM branch_offices ORDER BY monthly_sales DESC LIMIT 3 );
Dans cet exemple, ORDER BY est spécifié dans la sous-requête, donc la sous-requête renvoie les noms dans l’ordre des ventes mensuelles. Le ORDER BY dans la sous-requête ne s’applique pas à la requête externe. Cette requête renvoie les noms des trois succursales qui ont enregistré les ventes mensuelles les plus élevées, mais pas nécessairement dans l’ordre des ventes mensuelles.
Le tri peut être coûteux. Si vous voulez que les résultats de la requête externe soient triés, utilisez une clause
ORDER BY
uniquement au niveau supérieur de la requête, et évitez d’utiliser les clausesORDER BY
dans les sous-requêtes, sauf si nécessaire.
Exemples¶
Exemple d’ordre de tri pour les chaînes :
SELECT column1
FROM VALUES ('a'), ('1'), ('B'), (null), ('2'), ('01'), ('05'), (' this'), ('this'), ('this and that'), ('&'), ('%')
ORDER BY column1;
+---------------+
| COLUMN1 |
|---------------|
| this |
| % |
| & |
| 01 |
| 05 |
| 1 |
| 2 |
| B |
| a |
| this |
| this and that |
| NULL |
+---------------+
Exemple d’ordre de tri pour les nombres :
SELECT column1
FROM VALUES (3), (4), (null), (1), (2), (6), (5), (0005), (.05), (.5), (.5000)
ORDER BY column1;
+---------+
| COLUMN1 |
|---------|
| 0.05 |
| 0.50 |
| 0.50 |
| 1.00 |
| 2.00 |
| 3.00 |
| 4.00 |
| 5.00 |
| 5.00 |
| 6.00 |
| NULL |
+---------+
Exemples d’ordre de tri pour les valeurs NULL, le paramètre DEFAULT_NULL_ORDERING étant défini avec LAST
(par défaut) :
ALTER SESSION SET DEFAULT_NULL_ORDERING = 'LAST';
SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1;
+---------+
| COLUMN1 |
|---------|
| 1 |
| 2 |
| 3 |
| NULL |
| NULL |
+---------+
SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1 DESC;
+---------+
| COLUMN1 |
|---------|
| NULL |
| NULL |
| 3 |
| 2 |
| 1 |
+---------+
Cet exemple montre que le paramètre NULLS FIRST a la priorité sur la définition des paramètres DEFAULT_NULL_ORDERING :
SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1 NULLS FIRST;
+---------+
| COLUMN1 |
|---------|
| NULL |
| NULL |
| 1 |
| 2 |
| 3 |
+---------+
Exemples d’ordre de tri pour les valeurs NULL avec le paramètre DEFAULT_NULL_ORDERING défini avec FIRST
:
ALTER SESSION SET DEFAULT_NULL_ORDERING = 'FIRST';
SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1;
+---------+
| COLUMN1 |
|---------|
| NULL |
| NULL |
| 1 |
| 2 |
| 3 |
+---------+
SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1 DESC;
+---------+
| COLUMN1 |
|---------|
| 3 |
| 2 |
| 1 |
| NULL |
| NULL |
+---------+
Cet exemple montre que le paramètre NULLS LAST a la priorité sur la définition des paramètres DEFAULT_NULL_ORDERING :
SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1 NULLS LAST;
+---------+
| COLUMN1 |
|---------|
| 1 |
| 2 |
| 3 |
| NULL |
| NULL |
+---------+