La clause ORDER BY permet de trier les valeurs des colonnes par ordre croissant ou décroissant. Pour Faire un tri par ordre croissant, on ajoute le mot « ASC » à la fin de la colonne qui signifie croissant ou ASCENDANT. Pour trier les valeurs d’une colonne par ordre décroissant ou DESCENDANT, on utilise le mot « DESC ». Lorsqu’on ne précise pas avec ASC ou DESC, on obtient un retour par ordre croissant par défaut. Avec ORDER BY, on peut trier toutes les valeurs des lignes d’une ou de plusieurs colonnes d’une table. On peut classer les syntaxes utilisées par la clause ORDER BY de deux façons :
La syntaxe 1 :
SELECT nom_attribut (s) FROM nom_table ORDER BY nom_attribut ASC ;
Ou
SELECT nom_attribut (s) FROM nom_table ORDER BY nom_attribut DESC ;
La syntaxe 2 :
SELECT nom_attribut1, nom_attribut2, … FROM nom_table + ORDER BY nom_attribut1, nom_attribut1, … ASC ou DESC; .
Dans quel cas est-il nécessaire d’utiliser la syntaxe 2 ?
De façon pratique, lorsque vous utilisez la syntaxe 1 sur une colonne et que vous constatez que le résultat en retour sur cette colonne contient certaines valeurs identiques, alors il faut obligatoirement appliquer le même tri sur la colonne suivante pour avoir des résultats bien ordonnés. On applique alors la deuxième syntaxe 2.
Pour mieux comprendre la clause ORDER BY, nous allons utiliser la table employee pour faire des exemples. Voici notre table ci-dessous sur laquelle nous allons envoyer des requêtes avec ORDER BY.
Table employee
| id_employee | last_name | first_name | country | age |
| 1 | Jack | Harry | Swiss | 22 |
| 2 | Jones | Smith | England | 25 |
| 3 | Jack | Harry | Italy | 30 |
| 4 | William | James | Colombia | 35 |
| 5 | Michael | Oliver | England | 20 |
| 6 | Charles | Noah | England | 18 |
| 7 | Jack | Harry | Canada | 19 |
| 8 | Charles | Ava | England | 16 |
Demo
La clause ORDER BY sur une colonne
On affiche la liste des employés par ordre alphabétique de noms.
SELECT * FROM employee ORDER BY last_name ASC ;
Résultat :
| id_employee | last_name | first_name | country | age |
| 6 | Charles | Noah | England | 18 |
| 8 | Charles | Ava | England | 16 |
| 1 | Jack | Harry | Swiss | 22 |
| 3 | Jack | Harry | Italy | 30 |
| 7 | Jack | Harry | Canada | 19 |
| 2 | Jones | Smith | England | 25 |
| 5 | Michael | Oliver | England | 20 |
| 4 | William | James | Colombia | 35 |
Analyse:
On a la liste des personnes par ordre alphabétique de noms.
Le problème sur cette liste est qu’on a deux fois le nom « Charles » et trois fois le nom « Harry » c’est-à-dire deux différentes valeurs qui se répètent dans la colonne last_name . Dans ce cas on applique la syntaxe 2 qui dit que lorsque le résultat du tri sur une colonne contient des valeurs identiques, on applique le tri du même sur la colonne suivante avoir une liste ordonnée de façon cohérente. On va alors trier la colonne suivante first_name par ordre alphabétique aussi de prénom.
La clause ORDER BY avec deux colonnes
On affiche la liste des employés par ordre alphabétique de noms et prénoms.
SELECT * FROM employee ORDER BY last_name ASC, first_name ASC ;
Résultat :
| id_employee | last_name | first_name | country | age |
| 8 | Charles | Ava | England | 16 |
| 6 | Charles | Noah | England | 18 |
| 1 | Jack | Harry | Swiss | 22 |
| 3 | Jack | Harry | Italy | 30 |
| 7 | Jack | Harry | Canada | 19 |
| 2 | Jones | Smith | England | 25 |
| 5 | Michael | Oliver | England | 20 |
| 4 | William | James | Colombia | 35 |
Analyse:
On a une liste des employés par ordre alphabétique de noms et de prénoms.
Le problème sur cette deuxième liste est qu’on a encore des valeurs identiques (trois fois le prénom Harry) dans la colonne first_name dans laquelle nous avons ordonnée ; ce qui implique que nous devons encore appliquer la syntaxe 2 sur la colonne suivante country pour obtenir une liste bien ordonnée.
La clause ORDER BY avec trois colonnes
On affiche la liste des employés par ordre alphabétique de noms, prénoms et pays.
SELECT * FROM employee ORDER BY last_name ASC, first_name ASC, country ASC;
Résultat :
| id_employee | last_name | first_name | country | age |
| 8 | Charles | Ava | England | 16 |
| 6 | Charles | Noah | England | 18 |
| 7 | Jack | Harry | Canada | 19 |
| 3 | Jack | Harry | Italy | 30 |
| 1 | Jack | Harry | Swiss | 22 |
| 2 | Jones | Smith | England | 25 |
| 5 | Michael | Oliver | England | 20 |
| 4 | William | James | Colombia | 35 |
Remarque : Les valeurs de la colonne country sont toutes différentes, donc la liste des employé est bien ordonnée par ordre alphabétique.
Une fois que vous avez des valeurs toutes différentes, il est inutile de continuer dans le même ordre en passant à la colonne suivante.
On aurait pu utiliser un tri par ordre descendant ou décroissant. C’est un choix. Dans une même requête, on peut utiliser ASC et DESC. Tout dépend de ce qu’on veut retourner comme résultat.
La clause ORDER BY avec chaines de caractères alphanumériques, alphabétiques et numériques
- Valeurs alphanumériques
Le tri dans l’ordre croissant ASC de la clause ORDER BY avec des valeurs alphanumériques (chaines contenant des caractères alphabétiques et numériques) donne la priorité aux valeurs commençant par les chiffres que les lettres. On observe l’ordre inverse dans le cas d’un tri par ordre décroissant DESC.
Exemple : Nous allons ordonner chacune des trois colonnes par ordre croissant avec la clause ORDER BY. Soit la table table_2.
Table_2
| id | alphanumeric | numbers | letters |
| 1 | D1-t7 | 20 | aa |
| 2 | 0a-t7 | 15 | ae |
| 3 | 3a-t7 | 01 | ab |
| 4 | 1a-t7 | 71 | ca |
| 5 | C1-t7 | 18 | ad |
| 6 | A1-t7 | 63 | da |
| 7 | B1-t7 | 00 | ac |
| 8 | 2a-t7 | 90 | ba |
On affiche la table_2 par ordre croissant des chaines alphanumériques :
SELCT * FROM table_2 ORDER BY alphanumeric ASC ;
Résultat :
| id | alphanumeric | numbers | letters |
| 2 | 0a-t7 | 15 | ae |
| 4 | 1a-t7 | 71 | ca |
| 8 | 2a-t7 | 90 | ba |
| 3 | 3a-t7 | 01 | ab |
| 6 | A1-t7 | 63 | da |
| 7 | B1-t7 | 00 | ac |
| 5 | C1-t7 | 18 | ad |
| 1 | D1-t7 | 20 | aa |
On constate que les valeurs commençant par les chiffres sont triées avant celles des lettres, alors les chiffres sont prioritaires par rapport aux lettres dans un tri dans l’ordre croissant. Ce résultat sera inversé dans l’ordre du tri décroissant.
- Valeurs numériques
Le tri des valeurs numérique (nombres) avec clause ORDER BY est toujours soit de plus petits au plus grands selon l’ordre choisit.
SELCT * FROM table_2 ORDER BY numbers ASC ;
Résultat :
| id | alphanumeric | numbers | letters |
| 7 | B1-t7 | 00 | ac |
| 3 | 3a-t7 | 01 | ab |
| 2 | 0a-t7 | 15 | ae |
| 5 | C1-t7 | 18 | ad |
| 1 | D1-t7 | 20 | aa |
| 6 | A1-t7 | 63 | da |
| 4 | 1a-t7 | 71 | ca |
| 8 | 2a-t7 | 90 | ba |
- Valeurs alphabétiques
L’ordre d’une colonne contenant des valeurs alphabétiques (chaines de caractères) reste l’ordre alphabétique croissant ou décroissant selon le choix
On affiche la table_2 par ordre croissant de chaines de caractères.
SELECT * FROM table_2 ORDER BY letters ASC ;
| id | alphanumeric | numbers | letters |
| 1 | D1-t7 | 20 | aa |
| 3 | 3a-t7 | 01 | ab |
| 7 | B1-t7 | 00 | ac |
| 5 | C1-t7 | 18 | ad |
| 2 | 0a-t7 | 15 | ae |
| 8 | 2a-t7 | 90 | ba |
| 4 | 1a-t7 | 71 | ca |
| 6 | A1-t7 | 63 | da |
