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

SELECT ...
FROM ...
ORDER BY orderItem [ , orderItem , ... ]
[ ... ]
Copy
Où :
orderItem ::= { <column_alias> | <position> | <expr> } [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
Copy
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.

  • Sauf indication contraire, les valeurs NULL sont considérées comme supérieures à toutes les valeurs autres queNULL. En conséquence, l’ordre pour NULLS dépend de l’ordre de tri :

    • Si l’ordre de tri est ASC, NULLS est renvoyé en dernier ; pour forcer NULLS à être le premier, utilisez NULLS FIRST.

    • Si l’ordre de tri est DESC, NULLS est renvoyé en premier ; pour forcer NULLS à être le dernier, utilisez NULLS LAST.

  • 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

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

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

Exemple d’ordre de tri pour les valeurs NULL :

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 NULLS FIRST;

+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       1 |
|       2 |
|       3 |
+---------+

SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1 DESC;

+---------+
| COLUMN1 |
|---------|
|    NULL |
|    NULL |
|       3 |
|       2 |
|       1 |
+---------+

SELECT column1
FROM VALUES (1), (null), (2), (null), (3)
ORDER BY column1 DESC NULLS LAST;

+---------+
| COLUMN1 |
|---------|
|       3 |
|       2 |
|       1 |
|    NULL |
|    NULL |
+---------+
Copy