- Catégories :
ORDER BY¶
Spécifie un classement des lignes de la table de résultats à partir d’une liste SELECT.
Syntaxe¶
Tri par colonnes spécifiques
SELECT ...
FROM ...
ORDER BY orderItem [ , orderItem , ... ]
[ ... ]
Où :
orderItem ::= { <column_alias> | <position> | <expr> } [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
Tri par toutes les colonnes
SELECT ...
FROM ...
ORDER BY ALL [ { 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
ALL
Trie les résultats selon toutes les colonnes spécifiées dans la liste SELECT. Les résultats sont triés par colonnes dans l’ordre dans lequel ils apparaissent.
Par exemple, supposons que la liste SELECT contienne :
SELECT col_1, col_2, col_3 FROM my_table ORDER BY ALL;
Les résultats sont triés d’abord par
col_1
, puis parcol_2
, puis parcol_3
.Note
Vous ne pouvez pas spécifier ORDER BY ALL si une colonne dans la liste SELECT utilise une fonction d’agrégat.
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¶
Les exemples suivants montrent comment utiliser la fonction ORDER BY pour trier les résultats :
Tri par valeurs de chaîne¶
L’exemple suivant trie les résultats selon les valeurs de chaîne :
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 |
+---------------+
Tri par valeurs numériques¶
L’exemple suivant trie les résultats selon les valeurs numériques :
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 |
+---------+
Tri des valeurs NULLS en premier ou en dernier¶
L’exemple suivant configure toutes les requêtes de la session pour le tri des valeurs NULLS en dernier en définissant le paramètre DEFAULT_NULL_ORDERING sur LAST
.
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 |
+---------+
L’exemple suivant remplace le paramètre DEFAULT_NULL_ORDERING en spécifiant NULLS FIRST dans une requête :
SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1 NULLS FIRST;
+---------+
| COLUMN1 |
|---------|
| NULL |
| NULL |
| 1 |
| 2 |
| 3 |
+---------+
L’exemple suivant définit le paramètre DEFAULT_NULL_ORDERING sur FIRST
pour trier les valeurs NULLS en premier :
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 |
+---------+
L’exemple suivant remplace le paramètre DEFAULT_NULL_ORDERING en spécifiant NULLS LAST dans une requête :
SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1 NULLS LAST;
+---------+
| COLUMN1 |
|---------|
| 1 |
| 2 |
| 3 |
| NULL |
| NULL |
+---------+
Tri par toutes les colonnes dans la liste SELECT¶
Pour exécuter les exemples de cette section, créez la table suivante :
CREATE OR REPLACE TABLE my_sort_example(a NUMBER, s VARCHAR, b BOOLEAN);
INSERT INTO my_sort_example VALUES
(0, 'abc', TRUE),
(0, 'abc', FALSE),
(0, 'abc', NULL),
(0, 'xyz', FALSE),
(0, NULL, FALSE),
(1, 'xyz', TRUE),
(NULL, 'xyz', FALSE);
L’exemple suivant trie les résultats selon toutes les colonnes de la table :
SELECT * FROM my_sort_example
ORDER BY ALL;
Comme indiqué ci-dessous, les résultats sont triés d’abord par la colonne a
, puis par la colonne s
, puis par la colonne b
(l’ordre dans lequel les colonnes ont été définies dans la table).
+------+------+-------+
| A | S | B |
|------+------+-------|
| 0 | abc | False |
| 0 | abc | True |
| 0 | abc | NULL |
| 0 | xyz | False |
| 0 | NULL | False |
| 1 | xyz | True |
| NULL | xyz | False |
+------+------+-------+
L’exemple suivant trie les résultats par ordre croissant :
SELECT * FROM my_sort_example
ORDER BY ALL ASC;
+------+------+-------+
| A | S | B |
|------+------+-------|
| 0 | abc | False |
| 0 | abc | True |
| 0 | abc | NULL |
| 0 | xyz | False |
| 0 | NULL | False |
| 1 | xyz | True |
| NULL | xyz | False |
+------+------+-------+
L’exemple suivant définit le paramètre DEFAULT_NULL_ORDERING pour trier les valeurs NULL en dernier pour toutes les requêtes exécutées pendant la session :
ALTER SESSION SET DEFAULT_NULL_ORDERING = 'LAST';
SELECT * FROM my_sort_example
ORDER BY ALL;
+------+------+-------+
| A | S | B |
|------+------+-------|
| NULL | xyz | False |
| 0 | NULL | False |
| 0 | abc | NULL |
| 0 | abc | False |
| 0 | abc | True |
| 0 | xyz | False |
| 1 | xyz | True |
+------+------+-------+
L’exemple suivant spécifie NULLS FIRST dans une requête pour remplacer ce paramètre :
SELECT * FROM my_sort_example
ORDER BY ALL NULLS FIRST;
+------+------+-------+
| A | S | B |
|------+------+-------|
| NULL | xyz | False |
| 0 | NULL | False |
| 0 | abc | NULL |
| 0 | abc | False |
| 0 | abc | True |
| 0 | xyz | False |
| 1 | xyz | True |
+------+------+-------+
L’exemple suivant renvoie les colonnes dans l’ordre b
, s
et a
. Les résultats sont triés en premier lieu par b
, puis par s
, puis par a
:
SELECT b, s, a FROM my_sort_example
ORDER BY ALL NULLS LAST;
+-------+------+------+
| B | S | A |
|-------+------+------|
| False | abc | 0 |
| False | xyz | 0 |
| False | xyz | NULL |
| False | NULL | 0 |
| True | abc | 0 |
| True | xyz | 1 |
| NULL | abc | 0 |
+-------+------+------+