Retour à la liste des articles Articles
10 minutes de lecture

Guide détaillé de SQL ORDER BY

Il est souvent nécessaire d'afficher le résultat d'une requête SQL dans un ordre spécifique plutôt que de manière arbitraire. Dans cet article, je vais vous expliquer les nombreuses façons de le faire avec la clause SQL ORDER BY.

Pour trier des enregistrements en SQL, vous devez utiliser la clause ORDER BY. Dans cet article, j'expliquerai en détail comment utiliser ORDER BY pour trier le résultat par une ou plusieurs colonnes, dans l'ordre croissant (A-Z) ou décroissant (Z-A), et en utilisant la ou les colonnes existantes ou la ou les colonnes calculées par une fonction d'agrégation. Ne vous inquiétez pas, ce n'est pas aussi compliqué que cela en a l'air !

Comment trier les lignes en SQL

Si vous ne triez pas le résultat de votre requête SQL, l'ordre des lignes sera arbitraire. Si vous voulez que les lignes de la table résultante apparaissent dans un ordre spécifique, vous devrez utiliser la clause ORDER BY.

La syntaxe de base de ORDER BY est la suivante :

SELECT ...columns...
FROM table
ORDER BY sorting_column ASC/DESC;
  • Après le mot-clé ORDER BY, il suffit d'énumérer la ou les colonnes par lesquelles vous souhaitez trier les enregistrements.
  • Ces colonnes n'ont pas besoin d'être affichées dans la sortie, c'est-à-dire qu'elles doivent être listées dans l'instruction SELECT.
  • Vous définissez l'ordre de tri (croissant ou décroissant) à l'aide des mots-clés DESC et ASC. Le mot-clé ASC est facultatif ; si aucun mot-clé n'est spécifié après le nom de la colonne, les lignes seront triées par défaut dans l'ordre croissant.
  • ORDER BY est positionné à la fin de la requête.

Consultez cet article pour une animation sur le fonctionnement de ORDER BY. Voyons maintenant quelques cas pratiques d'utilisation de ORDER BY.

ORDRE PAR une colonne

Imaginez que nous gérons un magasin qui vend des costumes d'Halloween. Nous avons différents types de costumes, masques, chapeaux et accessoires en stock. Voici la table avec notre products:

products
idnamecategoryquantityprice
11Wonder Womancostumes219.95
12Vampiremasks43.95
13Magic Wandaccessories62.50
14Wizard of Ozhats33.95
15Supermancostumes314.95
16Hulkcostumes212.50
17Witchhats44.95
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
20Freddy Kruegermasks33.95
21Alienmasks0NULL
22Cowboyhats34.95
23Ghostbusteraccessories213.95
24Swordaccessories73.50
25Zombiemasks82.95

ORDER BY simple : Tri par une seule colonne

Commençons par un exemple très basique : classer nos articles par ordre alphabétique de leur nom. Pour trier les éléments par ordre alphabétique, il suffit d'ordonner notre ensemble de résultats par la colonne nom dans l'ordre croissant. Comme nous le savons, l'ordre croissant est l'ordre par défaut en SQL, le mot-clé ASC peut donc être omis. Voici notre requête :

SELECT *
FROM products
ORDER BY name;

Et voici le résultat, avec tous les enregistrements triés par ordre alphabétique en fonction du nom du produit :

idnamecategoryquantityprice
21Alienmasks0NULL
22Cowboyhats34.95
20Freddy Kruegermasks33.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
13Magic Wandaccessories62.50
18Rapunzelcostumes0NULL
19Snow Whitecostumes123.95
15Supermancostumes314.95
24Swordaccessories73.50
12Vampiremasks43.95
17Witchhats44.95
14Wizard of Ozhats33.95
11Wonder Womancostumes219.95
25Zombiemasks82.95

Plutôt simple, non ? Maintenant, trions nos costumes d'Halloween en fonction du prix, en commençant par le plus cher. Pour aller du prix le plus élevé au prix le plus bas, il faut trier par ordre décroissant. Ainsi, notre clause ORDER BY doit inclure le mot-clé DESC:

SELECT *
FROM products
ORDER BY price DESC;
idnamecategoryquantityprice
19Snow Whitecostumes123.95
11Wonder Womancostumes219.95
15Supermancostumes314.95
23Ghostbusteraccessories213.95
16Hulkcostumes212.50
17Witchhats44.95
22Cowboyhats34.95
14Wizard of Ozhats33.95
12Vampiremasks43.95
20Freddy Kruegermasks33.95
24Swordaccessories73.50
25Zombiemasks82.95
13Magic Wandaccessories62.50
21Alienmasks0NULL
18Rapunzelcostumes0NULL

Voici plusieurs éléments intéressants à noter concernant les tris SQL :

  • Ordre des rangées ayant la même valeur. Certains articles de notre tableau ont le même prix - plus précisément, les chapeaux de sorcière et de cow-boy sont à 4,95 $, tandis que le chapeau du magicien d'Oz et les masques de vampire et de Freddy Krueger sont à 3,95 $. Comment SQL ordonne-t-il de telles lignes ? Il n'existe en fait aucune règle spécifique pour ces cas ; le résultat est non déterministe. En d'autres termes, l'ordre des lignes contenant la même valeur de colonne de tri peut varier à chaque exécution de la requête. Si vous souhaitez que l'ordre des lignes soit cohérent, utilisez une colonne unique pour trier les lignes. Si ce n'est pas possible, voyez si vous pouvez trier le jeu de résultats en utilisant une combinaison de colonnes qui donne un ordre déterminé. Nous aborderons le tri par plusieurs colonnes plus loin dans cet article.
  • Comportement de tri pour les valeurs NULL. Dans le tableau de résultats ci-dessus, les lignes comportant des valeurs NULL dans la colonne de tri sont placées à la toute fin du tableau. Cependant, ce comportement n'est pas cohérent entre les différentes bases de données relationnelles. J'ai utilisé MySQL pour exécuter cette requête, et cette base de données considère les valeurs NULL comme la plus petite valeur possible. Ainsi, elle les trie en dernier lorsque l'ordre décroissant est demandé. Le résultat serait le même dans les bases de données SQL Server et SQLite. Toutefois, les bases de données PostgreSQL et Oracle considèrent les valeurs NULL comme les plus grandes valeurs possibles et les placent en premier lors du tri par ordre décroissant. Dans la plupart des cas, vous pouvez modifier le comportement par défaut de ORDER BY en ce qui concerne les valeurs NULL. Découvrez comment dans ce guide détaillé.

Super ! Passons à des exemples plus compliqués.

Tri par une colonne calculée par une fonction d'agrégation

En SQL, vous pouvez trier les résultats en fonction d'une ou plusieurs colonnes calculées. Cette colonne peut être calculée à l'aide d'une des fonctions agrégées (comme AVG(), SUM(), COUNT(), MAX(), MIN()) ou d'une autre méthode. Voyons comment cela fonctionne en pratique.

Dans notre prochain exemple, nous voulons voir quelles catégories de produits comprennent les articles les plus chers. Plus précisément, nous voulons trier les catégories en fonction du prix moyen des produits, en commençant par les plus chers.

Nous allons calculer le prix moyen de chaque catégorie, puis trier les lignes par ordre décroissant en fonction de cette colonne calculée :

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY avg_price DESC;

Notez que la clause ORDER BY est placée en dernier, après la clause GROUP BY. Voici le résultat :

categoryavg_price
costumes17.84
accessories6.65
hats4.62
masks3.62

Il est bon de noter que ORDER BY accepte la notation numérique lorsqu'il s'agit de la colonne de tri. Par exemple, pour trier le jeu de résultats en fonction de la première colonne, vous pouvez simplement écrire ORDER BY 1.

En conséquence, la requête suivante nous donnerait le même résultat que dans le tableau ci-dessus :

SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
ORDER BY 2 DESC;

Comme la colonne avg_price est la deuxième dans notre déclaration SELECT, nous pouvons y faire référence dans la clause ORDER BY en utilisant '2'.

Cette approche nous fait gagner du temps en matière de saisie, mais elle présente un inconvénient important. Si vous modifiez la requête en ajoutant d'autres champs à la déclaration SELECT, vous devez vous souvenir de vérifier si le numéro dans la clause ORDER BY est toujours pertinent ou doit être modifié. Malheureusement, cette étape est assez souvent négligée, ce qui entraîne un ordre erroné dans le jeu de résultats.

ORDER BY Multiple Columns

ORDER BY permet de trier le jeu de résultats en fonction de deux colonnes ou plus. Cependant, pour utiliser cet outil de manière appropriée, vous devez comprendre son fonctionnement :

  • Le tri commence par ordonner les données en fonction de la première colonne mentionnée dans la clause ORDER BY. Si cette colonne contient les mêmes valeurs, les lignes correspondantes sont ordonnées en fonction de la deuxième colonne mentionnée dans la clause ORDER BY, et ainsi de suite. Ainsi, l'ordre des colonnes a de l'importance.
  • Vous pouvez choisir l'ordre (c'est-à-dire ascendant ou descendant) pour chacune des colonnes énumérées dans ORDER BY. Pour spécifier l'ordre, il suffit de placer le mot-clé DESC ou ASC après chacune des colonnes énumérées. Si vous omettez le mot-clé DESC / ASC, le tri se fera par défaut dans l'ordre croissant.

Voyons quelques exemples.

Tri par plusieurs colonnes en SQL

Vous vous souvenez peut-être que lorsque nous avons trié nos produits en fonction du prix, le résultat du tri n'était pas déterministe. Plus précisément, plusieurs articles ayant le même prix auraient dû apparaître à la même position, mais étaient en fait classés de manière aléatoire. Si nous voulons mieux contrôler l'ordre de tri dans de tels cas, nous devons ajouter une autre colonne à la clause ORDER BY.

Par exemple, nous pouvons commencer par trier les articles en fonction de leur prix (du plus cher au moins cher). Ensuite, nous pouvons choisir de trier par ordre alphabétique les articles ayant le même prix. Cela implique un tri par prix dans l'ordre décroissant, puis un tri par nom dans l'ordre croissant. Voici la requête :

SELECT id, name, price
FROM products
ORDER BY price DESC, name;
idnameprice
19Snow White23.95
11Wonder Woman19.95
15Superman14.95
23Ghostbuster13.95
16Hulk12.50
22Cowboy4.95
17Witch4.95
20Freddy Krueger3.95
12Vampire3.95
14Wizard of Oz3.95
24Sword3.50
25Zombie2.95
13Magic Wand2.50
21AlienNULL
18RapunzelNULL

Nous n'avons sélectionné que trois colonnes afin de pouvoir nous concentrer plus facilement sur les résultats du tri. Comme vous pouvez le voir :

  • Les chapeaux de cow-boy et de sorcière ont le même prix et sont maintenant classés par ordre alphabétique.
  • De même, un autre groupe d'articles dont le prix est de 3,95 $ est également classé par ordre alphabétique.
  • Enfin, SQL considère les valeurs NULL dans la colonne de prix comme la même valeur, et nous avons donc ces rangées classées par ordre alphabétique selon le nom de l'article.

Vous pouvez utiliser la notation numérique pour énumérer plusieurs colonnes dans la clause ORDER BY; cela fonctionne de la même manière. La requête suivante nous donnera les mêmes résultats que la précédente :

SELECT id, name, price
FROM items
ORDER BY 3 DESC, 2;

Cependant, vous devez être très prudent avec la notation numérique, car l'édition de la requête peut modifier l'ordre des colonnes - et donc le résultat du tri.

Tri par plusieurs colonnes calculées

Ajoutons de la complexité à notre dernier exemple de tri. Dans ce cas, nous voulons trier les catégories de produits en fonction du nombre total d'articles en stock, en commençant par la catégorie qui compte le moins d'articles. Si toutes les catégories ont le même nombre d'articles en stock, nous voulons que la catégorie dont le prix du produit est le plus élevé soit listée en premier.

En d'autres termes, nous voulons trier le résultat par deux colonnes, toutes deux calculées à l'aide de fonctions d'agrégation. De plus :

  • La somme du nombre d'articles dans chaque catégorie doit être triée par ordre croissant.
  • Le prix maximum du produit dans chaque catégorie doit être trié par ordre décroissant.

Voici la requête et le résultat :

SELECT 
  category, 
  SUM(quantity) AS total_quantity, 
  MAX(price) AS max_price
FROM items
GROUP BY category
ORDER BY total_quantity, max_price DESC;
categorytotal_quantitymax_price
costumes823.95
hats104.95
accessories1513.95
masks153.95

Dans cette requête, nous calculons le nombre total d'articles (SUM(quantity)) et le prix maximum du produit (MAX(price)) pour chaque catégorie (GROUP BY catégorie ). Nous attribuons également les alias (total_quantity et max_price, respectivement). Enfin, nous classons les résultats par total_quantity dans l'ordre croissant (en omettant le mot-clé ASC ) et par max_price dans l'ordre décroissant (en utilisant le mot-clé DESC ).

Comme prévu, le tableau est trié par le nombre total d'articles dans chaque catégorie, en commençant par les costumes (qui ont le moins d'articles en stock). Mais remarquez que les catégories accessoires et masques ont toutes deux 15 articles en stock. Dans ce cas, le tri par la deuxième colonne entre en jeu et ces deux lignes sont classées en fonction du produit le plus cher de la catégorie correspondante. Plus précisément, la catégorie des accessoires est classée en premier (car elle comprend Ghostbusters, dont le prix est de 13,95 $), tandis que la catégorie des masques est classée en dernier (car les masques les plus chers ne coûtent que 3,95 $).

Pour en savoir plus sur les utilisations avancées de ORDER BY, comme l'insertion d'expressions dans la condition ORDER BY, consultez ce guide complet.

Il est temps de s'entraîner à utiliser le langage SQL ORDER BY !

ORDER BY semble assez facile à comprendre. Cependant, le tri des enregistrements en SQL comporte de nombreuses nuances qui s'apprennent mieux avec la pratique. Je vous recommande de commencer par le cours SQL pour les débutants qui couvre, entre autres, tout ce que vous devez savoir sur le tri des lignes en SQL. Le cours est interactif et comprend 149 défis de codage, du plus élémentaire au plus avancé.

Si vous souhaitez acquérir des bases solides en SQL, envisagez de suivre la formation de LearnSQL.fr. Les Fondamentaux de SQL du cours. Il comprend SQL pour les débutants et deux cours supplémentaires qui couvrent les fonctions SQL standard, la création et la mise à jour de tables en SQL, et bien plus encore.

Merci de votre lecture et bon apprentissage !