Cours SQL et MySQL · Module 2: Interroger les données (SELECT)

Trier selon plusieurs colonnes

5 min de lecture
Dans cette leçon6

Un seul champ ne suffit parfois pas. Quand plusieurs parchemins partagent la même valeur - par exemple plusieurs livres publiés la même année - tu as besoin d'un second critère pour départager les égalités.

Une égalité sur le rayon

Rappelle-toi la requête de la leçon précédente, qui range les livres du plus récent au plus ancien :

1SELECT tytul, rok_wydania
2FROM ksiazki
3ORDER BY rok_wydania DESC;

Tout en haut du résultat se trouvent deux livres de 2020 :

tytulrok_wydania
Tom Sawyer2020
Hamlet2020
Pan Tadeusz2015
Dziady2015
……

Pourquoi « Tom Sawyer » est-il avant « Hamlet » ? Sans raison. La Bibliothèque a trié uniquement par année, et leur année est la même. L'ordre des parchemins à égalité relève du hasard - demain, il peut être inversé.

Deux champs séparés par une virgule

Dans ORDER BY, tu peux donner plusieurs champs, séparés par une virgule. Ajoutons le titre comme second critère :

1SELECT tytul, rok_wydania
2FROM ksiazki
3ORDER BY rok_wydania DESC, tytul ASC;

Maintenant, le titre départage les égalités :

tytulrok_wydania
Hamlet2020
Tom Sawyer2020
Dziady2015
Pan Tadeusz2015
Etyka2012
Fajdros2012
……

La Bibliothèque trie d'abord selon le premier champ (rok_wydania décroissant). Ce n'est que lorsque plusieurs livres sont parus la même année qu'elle se tourne vers le second champ (tytul croissant) et les aligne par ordre alphabétique. L'ordre des années n'a pas changé - seul l'ordre à l'intérieur de chaque année a changé.

Chaque champ a sa propre direction

Chaque colonne peut avoir son propre ASC ou DESC. La direction se place juste après le nom du champ et ne concerne que lui. Ici, les deux champs sont croissants :

1SELECT imie, nazwisko, kraj
2FROM autorzy
3ORDER BY kraj ASC, nazwisko ASC;

Nous regroupons d'abord les auteurs par pays (par ordre alphabétique), puis, dans chaque pays, nous les rangeons par nom croissant :

imienazwiskokraj
ArystotelesArystotelesGrecja
EuklidesEuklidesGrecja
HomerHomerGrecja
PlatonPlatonGrecja
SofoklesSofoklesGrecja
AdamMickiewiczPolska
HenrykSienkiewiczPolska
MarkTwainUSA

On peut aussi mélanger les directions. Inversons l'ordre des pays et gardons les noms croissants :

1SELECT imie, nazwisko, kraj
2FROM autorzy
3ORDER BY kraj DESC, nazwisko ASC;

Les pays partent maintenant de la fin de l'alphabet, mais dans chaque pays les noms restent croissants :

imienazwiskokraj
MarkTwainUSA
AdamMickiewiczPolska
HenrykSienkiewiczPolska
ArystotelesArystotelesGrecja
EuklidesEuklidesGrecja
HomerHomerGrecja
PlatonPlatonGrecja
SofoklesSofoklesGrecja

L'erreur la plus fréquente

Puisqu'une direction ne concerne qu'un champ, on se trompe facilement. Quelqu'un voulait tout trier par ordre décroissant et n'a écrit DESC qu'une fois, tout à la fin :

1SELECT tytul, rok_wydania
2FROM ksiazki
3ORDER BY rok_wydania, tytul DESC;

Ici, le mot DESC ne concerne que le titre. L'année n'a pas de direction, donc elle reste croissante :

tytulrok_wydania
Medea1985
Antygona1985
Ajaks1985
Odyseja1990
Iliada1990
……

En haut se trouvent les livres les plus anciens, et non les plus récents. Seuls les titres de chaque année sont décroissants. Si les deux champs doivent décroître, écris DESC pour chacun : ORDER BY rok_wydania DESC, tytul DESC.

Quand les deux champs sont à égalité

Parfois, même deux champs ne suffisent pas. Sur le rayon des lecteurs, deux personnes ont le même prénom et le même nom. C'est pourquoi nous ajoutons à la fin un troisième champ, id, différent dans chaque ligne :

1SELECT id, imie, nazwisko, miasto
2FROM czytelnicy
3ORDER BY nazwisko ASC, imie ASC, id ASC;

Voici un extrait du résultat autour des Nowak :

idimienazwiskomiasto
…………
1AnnaNowakKraków
3AnnaNowakGdańsk
6JanNowakPoznań
…………

Sans id, les deux Anna Nowak seraient à égalité sur les deux champs et pourraient échanger leurs places. Avec id, leur ordre est fixé une fois pour toutes.

Pourquoi départager les égalités ?

  • Le résultat devient prévisible - les égalités sont départagées par le second champ, et non par le hasard. Si lui aussi se répète, ajoute un troisième, par exemple id.
  • Les rapports sont plus clairs - les données ont un ordre net à deux niveaux.

Mon conseil : avant de rendre un rapport, regarde le premier champ d'ORDER BY et demande-toi si une valeur peut s'y répéter. Si oui, ajoute un second champ. Dans la prochaine leçon, tu combineras le tri avec LIMIT pour bâtir tes premiers classements - là, une égalité due au hasard peut décider de qui entre dans le top trois.

Souviens-toi : le premier champ décide, et les suivants n'interviennent qu'en cas d'égalité. C'est ainsi qu'un scribe range même le rayon le plus encombré.

Tu as repéré une erreur dans cette leçon ?

Teste tes connaissances

Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.

  1. 1. Comment se comporte ORDER BY rok_wydania DESC, tytul ASC ?

  2. 2. Pourquoi donne-t-on une deuxième colonne dans ORDER BY, par exemple ORDER BY kraj ASC, nazwisko ASC ?

Tâches pratiques dans le jeu

  • Éditeur de code

    Écris une requête qui récupère tytul et rok_wydania de la table ksiazki et trie le résultat par rok_wydania décroissant, et pour une même année par tytul croissant.

  • Tri horizontal

    Ordonne les éléments dans le bon ordre pour construire une clause triant les auteurs par pays, puis par nom de famille (de gauche à droite) :