ORDER BY en SQL : trier les résultats d’une requête (guide complet)
Par défaut, une requête SQL renvoie les lignes dans un ordre non garanti — souvent celui du stockage, mais sur lequel on ne peut pas compter. Dès qu’on veut un résultat trié (du salaire le plus élevé au plus faible, par ordre alphabétique, du plus récent au plus ancien…), une clause s’impose : ORDER BY. Ce guide explique comment trier sur une ou plusieurs colonnes, gérer les sens et les valeurs NULL, avec des exemples concrets.
Il prolonge naturellement notre article sur les bases de SELECT et WHERE.
Le jeu de données d’exemple
Les exemples s’appuient sur une table employes :
| nom | service | salaire |
|---|---|---|
| Martin | Informatique | 3200 |
| Durand | Comptabilité | 2800 |
| Petit | Informatique | 3600 |
| Moreau | Comptabilité | 2800 |
| Leroy | Informatique | 4100 |
Trier sur une colonne
ORDER BY se place à la fin de la requête et indique la colonne de tri. Par défaut, le tri est croissant. Pour classer les employés par salaire croissant :
SELECT nom, salaire
FROM employes
ORDER BY salaire;
Résultat :
| nom | salaire |
|---|---|
| Durand | 2800 |
| Moreau | 2800 |
| Martin | 3200 |
| Petit | 3600 |
| Leroy | 4100 |
ASC et DESC : le sens du tri
Deux mots-clés précisent le sens : ASC (ascendant, croissant — la valeur par défaut) et DESC (descendant, décroissant). Pour classer du mieux payé au moins payé :
SELECT nom, salaire
FROM employes
ORDER BY salaire DESC;
Résultat : Leroy (4100), Petit (3600), Martin (3200), puis Durand et Moreau (2800). Le tri fonctionne aussi sur du texte (ordre alphabétique) et sur des dates (chronologique) :
SELECT nom FROM employes ORDER BY nom ASC;
Ce qui donne l’ordre alphabétique : Durand, Leroy, Martin, Moreau, Petit.
Trier sur plusieurs colonnes
On peut enchaîner plusieurs critères, séparés par des virgules. SQL trie d’abord sur la première colonne ; en cas d’égalité, il départage avec la suivante. Pour trier par service, puis par salaire décroissant à l’intérieur de chaque service :
SELECT nom, service, salaire
FROM employes
ORDER BY service ASC, salaire DESC;
Résultat :
| nom | service | salaire |
|---|---|---|
| Moreau | Comptabilité | 2800 |
| Durand | Comptabilité | 2800 |
| Leroy | Informatique | 4100 |
| Petit | Informatique | 3600 |
| Martin | Informatique | 3200 |
Chaque colonne a son propre sens : ici service croissant, mais salaire décroissant. On peut mélanger ASC et DESC librement.
Trier par position ou par alias
Deux raccourcis pratiques. On peut désigner la colonne de tri par sa position dans le SELECT (1 = première colonne) :
SELECT nom, salaire
FROM employes
ORDER BY 2 DESC; -- trie sur salaire (2e colonne)
Et contrairement au WHERE, ORDER BY accepte un alias défini dans le SELECT, car il s’exécute après. C’est utile pour trier sur un calcul :
SELECT nom, salaire * 12 AS salaire_annuel
FROM employes
ORDER BY salaire_annuel DESC;
La place des valeurs NULL
Les valeurs NULL (absentes) doivent bien se ranger quelque part. Leur position par défaut dépend du moteur : Oracle et PostgreSQL les placent en dernier en tri croissant, MySQL et SQL Server en premier. Pour maîtriser ce comportement, certains SGBD (Oracle, PostgreSQL) offrent la clause NULLS FIRST / NULLS LAST :
SELECT nom, salaire
FROM employes
ORDER BY salaire DESC NULLS LAST;
Cela garantit que les salaires inconnus apparaissent après les valeurs renseignées, quel que soit le moteur qui le supporte.
ORDER BY et performances
Trier a un coût, surtout sur de gros volumes. Deux réflexes utiles : un index sur la colonne de tri accélère considérablement l’opération ; et si vous ne voulez que les premières lignes (le top 10), limitez le résultat avec FETCH FIRST 10 ROWS ONLY (Oracle, standard SQL) ou LIMIT 10 (MySQL, PostgreSQL), après le ORDER BY.
L’ordre des clauses
ORDER BY est toujours la dernière clause de la requête :
SELECT colonnes
FROM table
WHERE condition
GROUP BY colonnes
ORDER BY tri;
En résumé
ORDER BY trie le résultat d’une requête : croissant par défaut, décroissant avec DESC, sur une ou plusieurs colonnes départagées dans l’ordre, y compris sur des alias ou des positions. Surveillez la place des NULL, qui varie selon les moteurs, et pensez aux index et à la limitation du nombre de lignes pour les gros volumes. C’est la clause qui transforme un résultat brut en une liste enfin exploitable. Pour aller plus loin, voyez les jointures et le regroupement GROUP BY.