Catégories :

Syntaxe de requête

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 , ... ]
  [ ... ]
Copy

Où :

orderItem ::= { <column_alias> | <position> | <expr> } [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
Copy

Tri par toutes les colonnes

SELECT ...
  FROM ...
  ORDER BY ALL [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ]
  [ ... ]
Copy

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;
Copy

Les résultats sont triés d’abord par col_1, puis par col_2, puis par col_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
      );
    
    Copy

    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 clauses ORDER 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;
Copy
+---------------+
| 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;
Copy
+---------+
| 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';
Copy
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1;
Copy
+---------+
| COLUMN1 |
|---------|
|       1 |
|       2 |
|       3 |
|    NULL |
|    NULL |
+---------+
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 DESC;
Copy
+---------+
| 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;
Copy
+---------+
| 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';
Copy
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1;
Copy
+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       1 |
|       2 |
|       3 |
+---------+
SELECT column1
  FROM VALUES (1), (null), (2), (null), (3)
  ORDER BY column1 DESC;
Copy
+---------+
| 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;
Copy
+---------+
| 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);
Copy

L’exemple suivant trie les résultats selon toutes les colonnes de la table :

SELECT * FROM my_sort_example
  ORDER BY ALL;
Copy

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;
Copy
+------+------+-------+
| 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';
Copy
SELECT * FROM my_sort_example
  ORDER BY ALL;
Copy
+------+------+-------+
| 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;
Copy
+------+------+-------+
| 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;
Copy
+-------+------+------+
| B     | S    | A    |
|-------+------+------|
| False | abc  | 0    |
| False | xyz  | 0    |
| False | xyz  | NULL |
| False | NULL | 0    |
| True  | abc  | 0    |
| True  | xyz  | 1    |
| NULL  | abc  | 0    |
+-------+------+------+