Cours SQL et MySQL · Module 2: Interroger les données (SELECT)
Trier selon plusieurs colonnes
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 :
| tytul | rok_wydania |
|---|---|
| Tom Sawyer | 2020 |
| Hamlet | 2020 |
| Pan Tadeusz | 2015 |
| Dziady | 2015 |
| … | … |
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 :
| tytul | rok_wydania |
|---|---|
| Hamlet | 2020 |
| Tom Sawyer | 2020 |
| Dziady | 2015 |
| Pan Tadeusz | 2015 |
| Etyka | 2012 |
| Fajdros | 2012 |
| … | … |
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 :
| imie | nazwisko | kraj |
|---|---|---|
| Arystoteles | Arystoteles | Grecja |
| Euklides | Euklides | Grecja |
| Homer | Homer | Grecja |
| Platon | Platon | Grecja |
| Sofokles | Sofokles | Grecja |
| Adam | Mickiewicz | Polska |
| Henryk | Sienkiewicz | Polska |
| Mark | Twain | USA |
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 :
| imie | nazwisko | kraj |
|---|---|---|
| Mark | Twain | USA |
| Adam | Mickiewicz | Polska |
| Henryk | Sienkiewicz | Polska |
| Arystoteles | Arystoteles | Grecja |
| Euklides | Euklides | Grecja |
| Homer | Homer | Grecja |
| Platon | Platon | Grecja |
| Sofokles | Sofokles | Grecja |
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 :
| tytul | rok_wydania |
|---|---|
| Medea | 1985 |
| Antygona | 1985 |
| Ajaks | 1985 |
| Odyseja | 1990 |
| Iliada | 1990 |
| … | … |
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 :
| id | imie | nazwisko | miasto |
|---|---|---|---|
| … | … | … | … |
| 1 | Anna | Nowak | Kraków |
| 3 | Anna | Nowak | Gdańsk |
| 6 | Jan | Nowak | Poznań |
| … | … | … | … |
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. Comment se comporte ORDER BY rok_wydania DESC, tytul ASC ?
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) :