Retour à la liste des articles Articles
9 minutes de lecture

Que signifie ORDER BY 1 en SQL ?

Avez-vous déjà vu la syntaxe "ORDER BY 1" dans des requêtes SQL et vous êtes-vous demandé ce qu'elle signifiait ? Dans cet article, nous allons explorer cette syntaxe, clarifier son objectif et la rendre plus facile à comprendre.

Que vous soyez un utilisateur expérimenté de SQL ou que vous commenciez à explorer ce langage, vous avez probablement déjà rencontré la clause ORDER BY. En SQL, la clause ORDER BY est utilisée pour trier les lignes d'une table en fonction d'une ou plusieurs colonnes. Elle vous permet de classer vos données par ordre croissant (A-Z, 1-10) ou décroissant (Z-A, 10-1) selon des critères spécifiques.

Après la clause ORDER BY, vous spécifiez généralement la colonne par laquelle vous souhaitez trier les données. Cependant, vous serez peut-être surpris d'apprendre que vous pouvez également utiliser une syntaxe telle que ORDER BY 1 dans une requête SQL. La syntaxe d'une telle requête est la suivante :

SELECT column_name(s)
FROM table_name
ORDER BY 1;

Si vous avez déjà vu ce type de code dans des requêtes SQL et que cela vous a laissé perplexe, ne vous inquiétez pas ! À la fin de cet article, vous comprendrez exactement comment il fonctionne et quand l'utiliser. Et si vous avez besoin de vous rafraîchir la mémoire sur la syntaxe SQL tout en lisant cet article, n'hésitez pas à consulter notre feuille de contrôleSQL pour les débutants !

Pour devenir vraiment bon en SQL, vous devez vous entraîner. Si vous voulez travailler sur de nombreux problèmes pratiques, nous vous recommandons d'essayer notre parcours La pratique du SQL. Vous apprendrez en résolvant des problèmes réels, en utilisant notre éditeur de code en ligne et des ensembles de données réels. Ce parcours comprend neuf cours et plus de 1 100 exercices pratiques.

Voyons ORDER BY 1 en action !

Imaginez que vous ayez un tableau appelé movie avec les colonnes suivantes :

  • id - L'ID du film, qui est également la clé primaire (PK) de la table.
  • title - Le titre du film.
  • length - La durée du film en minutes.
  • director - Le nom du réalisateur du film.
  • year - L'année de sortie du film.
  • rating - La note attribuée au film (de 1 à 10).

Voici quelques lignes du tableau :

idtitlelengthdirectoryearrating
1The Secret Quest110David Anderson20227
2Lost in Time95Emily Roberts20196
3Starship Odyssey150Michael Turner20218
4The Enchanted Forest85Sarah Johnson20227
5Epic Journey130Mark Lewis20207
6Space Explorers115Lisa Adams20227
7Time Travelers100Paul Miller20216
8Mystic Island140Jessica White20238
9The Great Discovery105Robert Green20217
10Underwater120Mary Johnson20216

Que se passe-t-il si nous exécutons la requête suivante ?

SELECT 
	title,
	length,
	director
FROM movie
ORDER BY 1;

En spécifiant ORDER BY 1, nous demandons à la base de données de trier les résultats en fonction de la première colonne de la liste SELECT, qui est title dans ce cas.

Cela signifie que la requête ci-dessus est équivalente à celle-ci :

SELECT 
	title,
	length,
	director
FROM movie
ORDER BY title;

La première requête est un peu plus courte, mais elle peut être plus difficile à comprendre. Dans la deuxième requête, vous pouvez facilement voir quelle colonne est utilisée pour le tri. Cela réduit le risque d'erreur.

Voici le résultat de notre requête :

titlelengthdirector
Epic Journey130Mark Lewis
Lost in Time95Emily Roberts
Mystic Island140Jessica White
Space Explorers115Lisa Adams
Starship Odyssey150Michael Turner
The Enchanted Forest85Sarah Johnson
The Great Discovery105Robert Green
The Secret Quest110David Anderson
Time Travelers100Paul Miller
Underwater120Mary Johnson

Si l'ordre des colonnes sélectionnées changeait, il faudrait utiliser un autre numéro de colonne :

SELECT
	director,
	title,
	length
FROM movie
ORDER BY 2;

Comme vous pouvez le constater, l'utilisation de cette syntaxe peut s'avérer quelque peu délicate.

Saviez-vous que vous pouvez utiliser une syntaxe similaire dans la clause GROUP BY? Consultez notre article sur la syntaxe GROUP BY 1!

Ordre ascendant et descendant

Par défaut, la clause ORDER BY trie les résultats du plus petit au plus grand, c'est-à-dire par ordre croissant. Cependant, il peut arriver que vous ayez besoin de trier les données par ordre décroissant. Vous pouvez également le faire en utilisant la syntaxe ORDER BY 1. Il vous suffit d'ajouter le mot-clé ASC ou DESC après 1.

Par exemple, si vous souhaitez récupérer la liste des films et la trier du plus long au plus court, vous pouvez exécuter une requête comme celle-ci :

SELECT
	title,
	length,
	director
FROM movie
ORDER BY 2 DESC;

La requête ci-dessus est l'équivalent de :

SELECT
	title,
	length,
	director
FROM movie
ORDER BY length DESC;

Et voici le résultat de notre requête :

titlelengthdirector
Starship Odyssey150Michael Turner
Mystic Island140Jessica White
Epic Journey130Mark Lewis
Underwater120Mary Johnson
Space Explorers115Lisa Adams
The Secret Quest110David Anderson
The Great Discovery105Robert Green
Time Travelers100Paul Miller
Lost in Time95Emily Roberts
The Enchanted Forest85Sarah Johnson

Que signifie ORDER BY 1, 2, 3 ?

Dans notre exemple précédent, nous avons trié les données sur la base d'une seule colonne. À présent, nous souhaitons ordonner nos lignes en fonction de trois colonnes différentes : year, rating, et title.

Pour ce faire, nous pouvons utiliser la requête suivante :

SELECT
	year,
	rating,
	title
FROM movie
ORDER BY 1, 2, 3;

Lorsque vous utilisez ORDER BY avec plusieurs colonnes, la base de données trie d'abord les lignes en fonction de la première colonne spécifiée. S'il y a des valeurs en double dans la première colonne, la base de données trie ensuite ces lignes en utilisant la deuxième colonne spécifiée, et ainsi de suite. Lorsque vous utilisez ORDER BY 1, 2, 3, vous demandez à la base de données de trier les résultats en fonction de la première, de la deuxième et de la troisième colonne de la liste SELECT.

Cela revient à exécuter la requête suivante :

SELECT
year,
rating,
title
FROM movie
ORDER BY year, rating, title;

Voici ce que la requête renvoie :

yearratingtitle
20196Lost in Time
20207Epic Journey
20216Time Travelers
20216Underwater
20217The Great Discovery
20218Starship Odyssey
20227Space Explorers
20227The Enchanted Forest
20227The Secret Quest
20238Mystic Island

La requête ci-dessus a trié les résultats par ordre croissant pour toutes les colonnes. Et si nous voulions trier les résultats par année, de la plus récente à la plus ancienne, puis par note, de la plus élevée à la plus basse, et enfin par titre, dans l'ordre alphabétique ? Nous pouvons faire tout cela en écrivant ASC ou DESC après chaque colonne :

SELECT
	year,
	rating,
	title
FROM movie
ORDER BY 1 DESC, 2 DESC, 3 ASC;

Le résultat de cette requête est le suivant :

yearratingtitle
20238Mystic Island
20227Space Explorers
20227The Enchanted Forest
20227The Secret Quest
20218Starship Odyssey
20217The Great Discovery
20216Time Travelers
20216Underwater
20207Epic Journey
20196Lost in Time

Notez que les numéros de colonne dans la clause ORDER BY ne doivent pas nécessairement être consécutifs. Vous pouvez également écrire une requête comme celle-ci :

SELECT
	title,
	year,
	rating
FROM movie
ORDER BY 2 DESC, 3 DESC, 1 ASC;

Nous demandons maintenant à la base de données de regrouper les résultats en fonction de la deuxième, de la troisième et de la première colonne de la liste SELECT.

Vous pouvez également mélanger les numéros et les noms de colonnes dans une seule clause ORDER BY:

SELECT
	title,
	year,
	rating
FROM movie
ORDER BY 2 DESC, 3 DESC, title ASC;

Cette fois, nous regroupons les résultats en fonction des deuxième et troisième colonnes de la liste SELECT et de la colonne title.

Les requêtes ci-dessus donnent les résultats suivants :

titleyearrating
Mystic Island20238
Space Explorers20227
The Enchanted Forest20227
The Secret Quest20227
Starship Odyssey20218
The Great Discovery20217
Time Travelers20216
Underwater20216
Epic Journey20207
Lost in Time20196

Attention : Ne pas utiliser la syntaxe ORDER BY 1

L'utilisation des syntaxes ORDER BY 1 et ORDER BY 1, 2, 3 en SQL est généralement considérée comme une mauvaise pratique car elle rend vos requêtes plus difficiles à lire et à maintenir. Bien qu'elle permette d'économiser de la frappe, elle peut également entraîner des problèmes inattendus.

Le principal problème de cette approche est qu'elle s'appuie sur l'ordre des colonnes dans votre déclaration SELECT plutôt que de spécifier directement les noms des colonnes. Si l'ordre des colonnes change ou si de nouvelles colonnes sont ajoutées, les résultats de votre requête risquent d'être modifiés de manière inattendue.

Par exemple, supposons que vous utilisiez la requête suivante pour obtenir la liste des films triés par année, de la plus récente à la plus ancienne, puis par note, de la plus élevée à la plus basse, et enfin par titre, dans l'ordre alphabétique :

SELECT
	title,
	year,
	rating
FROM movie
ORDER BY 2 DESC, 3 DESC, 1 ASC;

Imaginons maintenant que nous souhaitions également afficher le nom du réalisateur dans notre liste. Nous pouvons y parvenir en modifiant légèrement la requête :

SELECT
	title,
	director,
	year,
	rating
FROM movie
ORDER BY 2 DESC, 3 DESC, 1 ASC;

Mais lorsque nous exécutons cette requête, elle ne nous donne pas la bonne réponse ! Voici le résultat que nous obtenons :

titledirectoryearrating
The Enchanted ForestSarah Johnson20227
The Great DiscoveryRobert Green20217
Time TravelersPaul Miller20216
Starship OdysseyMichael Turner20218
UnderwaterMary Johnson20216
Epic JourneyMark Lewis20207
Space ExplorersLisa Adams20227
Mystic IslandJessica White20238
Lost in TimeEmily Roberts20196
The Secret QuestDavid Anderson20227

Il semble que les lignes ne soient pas triées par year, rating, et title comme prévu. Cela démontre les pièges potentiels liés à l'utilisation de l'ordre des colonnes au lieu de spécifier les noms des colonnes directement dans la clause ORDER BY. Pouvez-vous repérer l'erreur dans notre requête modifiée ?

Le résultat est incorrect parce que nous avons essayé de trier nos lignes par les colonnes director, year, et title au lieu de l'année, de la note et du titre.

La requête correcte serait la suivante :

SELECT
	title,
	director,
	year,
	rating
FROM movie
ORDER BY 3 DESC, 4 DESC, 1 ASC;

Mais nous pouvons éviter cette erreur en utilisant simplement la clause ORDER BY avec les noms complets des colonnes :

SELECT
	title,
	director,
	year,
	rating
FROM movie
ORDER BY year DESC, rating DESC, title ASC;

Désormais, même si nous décidons de modifier ou de déplacer des colonnes dans l'instruction SELECT, nous n'avons plus à nous préoccuper de la partie ORDER BY.

Comme vous pouvez le constater, il est préférable de mentionner explicitement les noms des colonnes par lesquelles vous souhaitez effectuer un tri dans la clause ORDER BY. Cela rend votre requête plus facile à lire et moins susceptible de contenir des erreurs.

L'astuce ORDER BY 1 convient lorsque vous ne faites que consulter des données par vous-même et que vous souhaitez accélérer la saisie. Mais si vous avez l'intention de réutiliser la requête d'une manière ou d'une autre, il est préférable d'utiliser la syntaxe complète avec les noms de colonnes.

Curieux d'en savoir plus sur ORDER BY 1 ?

C'est tout ce que nous avons pour aujourd'hui ! Si vous souhaitez en savoir plus sur l'utilisation de la clause ORDER BY, consultez nos articles pour apprendre à utiliser ORDER BY en détail et voir des exemples concrets d'utilisation de ORDER BY.

Et pour plus de pratique, n'oubliez pas de consulter notre piste La pratique du SQL!