CodeGym /Cours /SQL SELF /Tri sur plusieurs colonnes : ordre de tri et priorités

Tri sur plusieurs colonnes : ordre de tri et priorités

SQL SELF
Niveau 6 , Leçon 2
Disponible

Imagine que tu bosses avec une énorme base de données sur les étudiants. Trier juste par nom de famille, c’est déjà utile, mais imagine qu’il y a plusieurs étudiants avec le même nom de famille dans ta table. Dans ce cas, pour rendre l’affichage plus lisible, tu peux ajouter un tri par prénom. Ou un autre exemple : tu veux organiser une liste de commandes d’abord par date, puis par le montant total de la commande. Et c’est là que le tri sur plusieurs colonnes devient super pratique.

Le tri sur plusieurs colonnes permet de : 1. Organiser les données dans un ordre bien défini ; 2. Gérer les priorités de tri (d’abord sur une colonne, puis sur une autre) ; 3. Afficher les données de façon plus structurée et lisible.

Syntaxe du tri sur plusieurs colonnes

Pour trier sur plusieurs colonnes, on utilise l’opérateur classique ORDER BY, mais cette fois on liste plusieurs colonnes séparées par des virgules. PostgreSQL trie d’abord sur la première colonne, puis (si les valeurs sont identiques) sur la deuxième, etc.

Voici la syntaxe générale :

SELECT colonnes
FROM table
ORDER BY colonne1 direction1,  colonne2 direction2, ... ;

Où :

  • colonne1, colonne2, ... — ce sont les colonnes sur lesquelles tu veux trier.
  • direction1, direction2, ... — c’est le sens du tri (ASC — croissant, DESC — décroissant).
  • Ce paramètre est optionnel, par défaut c’est ASC qui est utilisé.

Exemple 1 : Trier les étudiants par nom de famille puis par prénom

Imaginons une table students avec des infos sur les étudiants :

id first_name last_name age
1 Anna Lin 20
2 Victor Lin 22
3 Maria Kim 21
4 Otto Lin 23
5 Anna Kim 20

Notre objectif — trier les étudiants d’abord par nom de famille (last_name), puis par prénom (first_name).

SELECT id, first_name, last_name, age
FROM students
ORDER BY last_name ASC, first_name ASC;

Résultat :

id first_name last_name age
5 Anna Kim 20
3 Maria Kim 21
1 Anna Lin 20
4 Otto Lin 23
2 Victor Lin 22

Comme tu vois, les lignes sont d’abord triées par nom de famille (Kim, puis Lin), puis par prénom (Anna, Maria, etc.). C’est super utile quand tu dois retrouver quelqu’un dans une liste ou trier un registre.

Exemple 2 : Trier les commandes par date et montant

Imaginons une table orders avec des infos sur les commandes :

order_id customer_id order_date total
1 101 2025-10-01 500
2 102 2025-10-03 200
3 103 2025-10-02 300
4 104 2025-10-01 100
5 101 2025-10-03 600

On veut trier les commandes d’abord par date order_date, puis par le montant total en ordre décroissant.

Requête SQL :

SELECT order_id, customer_id, order_date, total
FROM orders
ORDER BY order_date ASC, total DESC;

Résultat :

order_id customer_id order_date total
1 101 2025-10-01 500
4 104 2025-10-01 100
3 103 2025-10-02 300
5 101 2025-10-03 600
2 102 2025-10-03 200

Comme tu vois, les commandes avec la même date sont aussi triées par montant.

Gérer les NULL lors du tri : NULLS FIRST et NULLS LAST

En SQL, il y a une valeur spéciale — NULL, qui veut dire qu’il n’y a pas de valeur. On verra plus en détail comment bosser avec ça dans quelques chapitres. Mais c’est le bon moment pour te montrer comment tu peux gérer leur placement lors du tri.

Quand tu tries des colonnes qui contiennent des NULL, PostgreSQL doit décider où placer les valeurs vides : au début ou à la fin.

Par défaut :

  • Avec ORDER BY ... ASC : NULL vont à la fin (NULLS LAST)
  • Avec ORDER BY ... DESC : NULL vont au début (NULLS FIRST)

Parfois ce comportement n’est pas pratique — et tu peux le contrôler explicitement avec NULLS FIRST ou NULLS LAST.

Syntaxe :

ORDER BY colonne ASC NULLS FIRST
ORDER BY colonne DESC NULLS LAST

Exemple : tri par notes, où NULL = "note pas encore attribuée"

SELECT student_id, grade
FROM grades
ORDER BY grade DESC NULLS LAST;

Comme ça, on aura d’abord les meilleurs étudiants, puis les moins bons, et tout à la fin — ceux qui n’ont pas encore de note (NULL).

Exemple : à l’inverse — afficher d’abord les étudiants sans note

Imaginons qu’on a une table grades où certains étudiants n’ont pas encore reçu de note (NULL) :

student_id grade
101 NULL
102 85
103 NULL
104 92
105 76

On veut d’abord afficher les étudiants sans note, puis les autres par ordre croissant de notes.

SELECT student_id, grade
FROM grades
ORDER BY grade ASC NULLS FIRST;

Résultat :

student_id grade
101 NULL
103 NULL
105 76
102 85
104 92

L’opérateur NULLS FIRST combiné avec ORDER BY grade ASC garantit que les lignes avec NULL seront au début, puis les notes en ordre croissant.

À propos des particularités et erreurs classiques

Les débutants oublient souvent d’indiquer le sens du tri pour chaque colonne. Si tu ne précises rien, PostgreSQL utilise ASC par défaut. Aussi, il ne faut pas oublier que l’ordre des colonnes dans ORDER BY compte : d’abord le tri se fait sur la première colonne, puis sur la suivante si les valeurs de la première sont égales.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION