Maintenez SQLtest en vie : Aidez à couvrir les coûts du serveur de ce mois-ci de 100 $ pour garder toutes les leçons et le terrain de jeu SQL en ligne. Soutenez le projet →
Code SQL copié dans le presse-papiers

Leçon 2.5 · Temps de lecture : ~6 min

La clause SQL ORDER BY trie les lignes du résultat d'une requête selon une ou plusieurs colonnes ou expressions. Dans cette leçon, vous apprendrez le tri croissant et décroissant, le tri sur plusieurs colonnes, le tri par expressions et par alias, et l'ordre des valeurs NULL.

SQL ORDER BY : trier les résultats d'une requête

Une table n'a pas d'ordre de lignes intégré. Sans ORDER BY, la base de données renvoie les lignes dans l'ordre qui lui est le plus pratique, et cet ordre peut changer d'une exécution à l'autre. Dès que l'ordre compte — pour un rapport, un classement ou un journal chronologique —, il faut le demander explicitement.

SQL ORDER BY : tri croissant et décroissant, tri sur plusieurs colonnes où la colonne suivante départage les égalités, et place des valeurs NULL

La clause ORDER BY

ORDER BY s'écrit à la fin d'une instruction SELECT et liste les clés de tri.

Syntaxe de base

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
  • ASC trie par ordre croissant : du plus petit au plus grand, de A à Z, du plus ancien au plus récent. C'est l'ordre par défaut.
  • DESC trie par ordre décroissant.

Trier sur une colonne

SELECT first_name, last_name
FROM actor
ORDER BY last_name;

Résultat : tous les acteurs par ordre alphabétique de leur nom de famille.

Pour inverser l'ordre, ajoutez DESC :

SELECT title, length
FROM film
ORDER BY length DESC;

Résultat : les films du plus long au plus court.


Trier sur plusieurs colonnes

Lorsque la première clé de tri a des valeurs égales, la base de données ordonne ces lignes avec la deuxième clé, puis la troisième, et ainsi de suite :

SELECT first_name, last_name
FROM actor
ORDER BY last_name, first_name;

Résultat : les acteurs triés par nom de famille ; ceux qui ont le même nom de famille sont triés par prénom.

Chaque colonne a son propre sens de tri. ASC ou DESC ne s'applique qu'à la colonne qu'il suit :

SELECT title, rating, length
FROM film
ORDER BY rating, length DESC;

Résultat : les films regroupés par classification ; dans chaque classification, les plus longs viennent en premier.


Trier par expressions

Vous pouvez trier par une valeur calculée, pas seulement par une colonne stockée. L'expression est évaluée pour chaque ligne, puis les lignes sont triées selon le résultat :

SELECT title, rental_rate, rental_duration
FROM film
ORDER BY rental_rate * rental_duration DESC;

Résultat : les films triés selon le coût d'une location complète, les plus chers en premier.

Une comparaison peut aussi servir de clé de tri. C'est pratique pour placer certaines lignes en tête :

SELECT title, rating
FROM film
ORDER BY rating = 'G' DESC, title;

Résultat : les films classés G en tête, puis tous les autres ; chaque groupe est trié par titre.

Dans MySQL et MariaDB, une comparaison renvoie 1 ou 0, donc DESC place les lignes correspondantes en premier. Tous les SGBD ne savent pas trier par une comparaison ; la méthode portable utilise CASE, que vous verrez dans la leçon 3.5.


Trier par alias et par position de colonne

ORDER BY est traité après SELECT, il peut donc utiliser les alias de colonnes qui y sont définis :

SELECT title, rental_rate * rental_duration AS full_rental_cost
FROM film
ORDER BY full_rental_cost DESC;

Vous pouvez aussi trier par la position d'une colonne dans la liste SELECT :

SELECT first_name, last_name
FROM actor
ORDER BY 2, 1;

Résultat : les acteurs triés par la deuxième colonne (last_name), puis par la première (first_name).

Le tri par position est pratique pour des requêtes rapides, mais il se casse silencieusement quand quelqu'un modifie la liste des colonnes. Dans les requêtes enregistrées, préférez les noms ou les alias.


Tri et valeurs NULL

NULL signifie « pas de valeur », la base de données doit donc décider où placer ces lignes. Dans MySQL, MariaDB et SQL Server, les valeurs NULL viennent en premier en ordre croissant et en dernier en ordre décroissant. Dans PostgreSQL et Oracle, c'est l'inverse.

SELECT rental_id, rental_date, return_date
FROM rental
ORDER BY return_date
LIMIT 10;

Résultat : dans MySQL, les locations pas encore rendues (return_date est NULL) apparaissent en premier.


Points clés :

  • Sans ORDER BY, l'ordre des lignes d'un résultat n'est pas garanti.
  • ASC (par défaut) trie par ordre croissant, DESC par ordre décroissant.
  • Avec plusieurs clés de tri, chaque clé suivante ordonne les lignes égales selon la précédente.
  • ASC et DESC s'appliquent à chaque colonne séparément.
  • Vous pouvez trier par expressions, alias et positions ; les noms et alias sont plus fiables que les positions.
  • La place des valeurs NULL dépend du SGBD.

Questions fréquentes

Quel est l'ordre de tri par défaut en SQL ?

L'ordre croissant (ASC). ORDER BY last_name et ORDER BY last_name ASC renvoient le même résultat.

Comment trier sur plusieurs colonnes dans des sens différents ?

Écrivez le sens après chaque colonne : ORDER BY rating ASC, length DESC. Un sens de tri ne s'applique qu'à la colonne qu'il suit.

Peut-on utiliser un alias de colonne dans ORDER BY ?

Oui. ORDER BY est traité après SELECT, donc les alias définis dans la liste SELECT y sont disponibles. C'est différent de WHERE, où les alias ne peuvent pas être utilisés.

Essayez de resoudre les exercices suivants pour consolider ce que vous avez appris dans cette lecon.

  1. Liste de films triée
  2. Obtenir la liste triée des langues
  3. Liste des clients
  4. Données des aéroports
  5. Afficher les départements