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
ASCqui 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:NULLvont à la fin (NULLS LAST) - Avec
ORDER BY ... DESC:NULLvont 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.
GO TO FULL VERSION