Cours SQL et MySQL · Module 2: Interroger les données (SELECT)
LIMIT - limiter le nombre de lignes
Dans cette leçon5
Parfois, tu ne veux pas tout le rayon - seulement les premiers parchemins. C'est à cela que sert LIMIT.
LIMIT - seulement N lignes
Imagine qu'on te confie un rayon inconnu et que tu veuilles juste voir ce qu'il contient. Notre rayon compte dix-sept parchemins, mais ceux des vraies bibliothèques comptent des milliers de lignes. Pour un aperçu, les premières suffisent. On ajoute LIMIT tout à la fin de la requête, suivi du nombre de lignes :
1SELECT tytul FROM ksiazki LIMIT 5;La Bibliothèque compte cinq parchemins et s'arrête :
| tytul |
|---|
| Iliada |
| Odyseja |
| Państwo |
| Uczta |
| Antygona |
Cela renvoie cinq livres - les premiers dans l'ordre où la Bibliothèque les donne à ce moment-là. Sans ORDER BY, cet ordre n'est pas fixé ; c'est pourquoi LIMIT va presque toujours de pair avec un tri. Pour un aperçu, un tel résultat suffit, mais il ne prouve rien : ce ne sont ni « les cinq plus anciens », ni « les cinq plus importants ».
Un classement : ORDER BY et LIMIT
Quand tu combines LIMIT avec un tri, de véritables classements voient le jour. ORDER BY range d'abord les parchemins, puis LIMIT ne garde que le haut de la liste :
1SELECT tytul, cena
2FROM ksiazki
3ORDER BY cena DESC
4LIMIT 3;Cette requête montre les trois livres les plus chers - nous trions par prix décroissant et ne gardons que les trois premiers parchemins :
| tytul | cena |
|---|---|
| Elementy | 89.00 |
| Polityka | 61.20 |
| Etyka | 58.00 |
Les quatorze autres livres sont toujours sur le rayon. LIMIT ne supprime rien, il raccourcit seulement la réponse.
Une égalité à la limite
Un classement cache un piège. Demande les cinq livres les plus récents :
1SELECT tytul, rok_wydania
2FROM ksiazki
3ORDER BY rok_wydania DESC
4LIMIT 5;Le résultat a l'air innocent :
| tytul | rok_wydania |
|---|---|
| Tom Sawyer | 2020 |
| Hamlet | 2020 |
| Pan Tadeusz | 2015 |
| Dziady | 2015 |
| Etyka | 2012 |
Pourtant, deux livres sont parus en 2012 : « Etyka » et « Fajdros ». Il n'y a qu'une cinquième place, donc MySQL peut afficher l'un ou l'autre. La documentation de MySQL 8.0 (chapitre « LIMIT Query Optimization ») le dit clairement : quand plusieurs lignes ont des valeurs égales dans les colonnes d'ORDER BY, le serveur peut les renvoyer dans n'importe quel ordre. Aujourd'hui, « Etyka » est cinquième, demain ce pourra être « Fajdros ». Un second champ de tri règle le problème :
1SELECT tytul, rok_wydania
2FROM ksiazki
3ORDER BY rok_wydania DESC, tytul ASC
4LIMIT 5;Maintenant, l'alphabet décide de la cinquième place, et le résultat est toujours le même :
| tytul | rok_wydania |
|---|---|
| Hamlet | 2020 |
| Tom Sawyer | 2020 |
| Dziady | 2015 |
| Pan Tadeusz | 2015 |
| Etyka | 2012 |
Où se place LIMIT ?
Souviens-toi de l'ordre sacré : SELECT → FROM → ORDER BY → LIMIT. LIMIT se place toujours tout à la fin de la requête, après le tri. Voici dix lecteurs par ordre alphabétique :
1SELECT imie, nazwisko
2FROM czytelnicy
3ORDER BY nazwisko ASC
4LIMIT 10;D'abord le tri par nom, puis LIMIT garde les dix premières lignes :
| imie | nazwisko |
|---|---|
| Lena | Baran |
| Igor | Dudek |
| Adam | Kaczmarek |
| Jan | Kowalski |
| Ula | Krawczyk |
| Kasia | Lis |
| Ola | Mazur |
| Anna | Nowak |
| Anna | Nowak |
| Jan | Nowak |
Les trois personnes nommées Nowak entrent toutes dans les dix premiers : l'égalité ne change donc pas la composition de la liste - tout au plus leur ordre entre elles.
LIMIT a aussi deux cas limites. Si tu demandes plus de lignes que le rayon n'en contient, par exemple LIMIT 100, tu les obtiens simplement toutes. Et LIMIT 0 renvoie un résultat vide, sans aucun parchemin.
Pourquoi limiter le résultat ?
- Aperçu - tu veux juste un coup d'œil sur les premières lignes, pas tout le rayon.
- Classements - « le top trois », « les cinq plus récents » naissent de ORDER BY + LIMIT.
- Rapidité - la Bibliothèque n'a pas besoin de renvoyer des milliers de parchemins d'un coup.
Mon conseil : utilise LIMIT sans ORDER BY seulement pour un aperçu. Quand le résultat doit avoir un sens - un classement, une liste de prix, un palmarès - fixe d'abord l'ordre, et si des égalités sont possibles dans le champ de tri, ajoute-en un second.
LIMIT est la main du scribe qui arrête le flot de parchemins une fois le nombre demandé atteint. Dans la prochaine leçon, nous y ajouterons OFFSET et apprendrons à paginer.
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. Que va renvoyer la requête « SELECT tytul FROM ksiazki LIMIT 5; » ?
2. Où place-t-on la clause LIMIT dans une requête ?
Tâches pratiques dans le jeu
- Éditeur de code
Écris une requête qui récupère toutes les colonnes de la table czytelnicy et n'affiche que les 5 premières lignes.
- Tri vertical
Ordonne les clauses d'un classement des trois livres les plus chers dans le bon ordre (de haut en bas) :
- Éditeur de code
Écris une requête qui récupère tytul et cena de la table ksiazki, trie par prix décroissant et n'affiche que les 3 livres les plus chers.