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_employeelast_namefirst_namecountryage
1JackHarrySwiss22
2JonesSmithEngland25
3JackHarryItaly30
4WilliamJamesColombia35
5MichaelOliverEngland20
6CharlesNoahEngland18
7JackHarryCanada19
8CharlesAvaEngland16

 

 

 

 

 

 

 

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_employeelast_namefirst_namecountryage
6CharlesNoahEngland18
8CharlesAvaEngland16
1JackHarrySwiss22
3JackHarryItaly30
7JackHarryCanada19
2JonesSmithEngland25
5MichaelOliverEngland20
4WilliamJamesColombia35

 

 

 

 

 

 

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_employeelast_namefirst_namecountryage
8CharlesAvaEngland16
6CharlesNoahEngland18
1JackHarrySwiss22
3JackHarryItaly30
7JackHarryCanada19
2JonesSmithEngland25
5MichaelOliverEngland20
4WilliamJamesColombia35

 

 

 

 

 

 

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_employeelast_namefirst_namecountryage
8CharlesAvaEngland16
6CharlesNoahEngland18
7JackHarryCanada19
3JackHarryItaly30
1JackHarrySwiss22
2JonesSmithEngland25
5MichaelOliverEngland20
4WilliamJamesColombia35

 

 

 

 

 

 

 

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

  1. 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

idalphanumericnumbersletters
1D1-t720aa
20a-t715ae
33a-t701ab
41a-t771ca
5C1-t718ad
6A1-t763da
7B1-t700ac
82a-t790ba

 

On affiche la table_2 par ordre croissant des chaines alphanumériques :

SELCT * FROM table_2 ORDER BY alphanumeric ASC ;

Résultat :

idalphanumericnumbersletters
20a-t715ae
41a-t771ca
82a-t790ba
33a-t701ab
6A1-t763da
7B1-t700ac
5C1-t718ad
1D1-t720aa

 

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.

  1. 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 :

idalphanumericnumbersletters
7B1-t700ac
33a-t701ab
20a-t715ae
5C1-t718ad
1D1-t720aa
6A1-t763da
41a-t771ca
82a-t790ba

 

  1. 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 ;

 

idalphanumericnumbersletters
1D1-t720aa
33a-t701ab
7B1-t700ac
5C1-t718ad
20a-t715ae
82a-t790ba
41a-t771ca
6A1-t763da