SQL LIMIT et OFFSET : limiter et paginer
« Les 5 produits les plus chers », « les 10 dernières commandes », « la page 3 des résultats »… Toutes ces demandes reposent sur deux mots-clés : LIMIT, qui garde un nombre maximum de lignes, et OFFSET, qui en saute un certain nombre.
Syntaxe
SELECT colonnes
FROM table
ORDER BY colonne
LIMIT nombre OFFSET lignes_a_sauter;Comment ça marche
LIMIT ngarde au plusnlignes.OFFSET ksaute leskpremières lignes avant de commencer à garder.
Ces deux clauses s'appliquent après le tri. Un LIMIT sans ORDER BY renvoie donc des lignes quelconques : pour un « top 5 », le tri est indispensable.
Paginer des résultats
Pour afficher des pages de 10 lignes, la page p (en commençant à 1) s'obtient avec LIMIT 10 OFFSET (p - 1) * 10.
Selon les bases de données
LIMIT existe en SQLite, MySQL et PostgreSQL. SQL Server utilise SELECT TOP 5 …, et le standard SQL (Oracle, PostgreSQL, SQL Server) propose OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY.
Schéma
| nom | prix |
|---|---|
| Écran | 289 |
| SSD | 149 |
| Clavier | 49 |
| Plaid | 25 |
| nom | prix |
|---|---|
| Écran | 289 |
| SSD | 149 |
Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).
Exemples avec leurs résultats
1. Le top 5
Les 5 produits les plus chers.
SELECT nom, prix
FROM produits
ORDER BY prix DESC
LIMIT 5; Essayer dans le bac à sable| nom | prix |
|---|---|
| Écran 27" | 342 |
| SSD 1To | 317 |
| Souris sans fil | 103 |
| Webcam HD | 101 |
| Casque gaming | 98 |
5 lignes au total
2. Paginer avec OFFSET
La « page 2 » des produits classés par prix décroissant, 5 par page.
SELECT nom, prix
FROM produits
ORDER BY prix DESC
LIMIT 5 OFFSET 5; Essayer dans le bac à sable| nom | prix |
|---|---|
| Bougie parfumée | 60,92 |
| Lampe LED | 51,74 |
| Hub USB-C | 49 |
| Cafetière | 47,62 |
| Raquette | 46,18 |
5 lignes au total
3. La dernière commande
Avec un tri décroissant, LIMIT 1 donne la commande la plus récente.
SELECT id, date_commande, statut
FROM commandes
ORDER BY date_commande DESC, id DESC
LIMIT 1; Essayer dans le bac à sable| id | date_commande | statut |
|---|---|---|
| 473 | 2025-12-28 | livrée |
1 ligne au total
Les erreurs fréquentes
LIMIT sans ORDER BY
Le « top 5 » n'a aucun sens sans tri : la base renvoie 5 lignes au hasard de son stockage.
SELECT nom, prix FROM produits LIMIT 5;SELECT nom, prix FROM produits ORDER BY prix DESC LIMIT 5;Se tromper dans le calcul de l'OFFSET
La première page commence à OFFSET 0, pas 1. Avec OFFSET 1, on perd la première ligne.
SELECT nom FROM produits ORDER BY nom LIMIT 5 OFFSET 1;SELECT nom FROM produits ORDER BY nom LIMIT 5 OFFSET 0;Ignorer les égalités
Si plusieurs lignes sont à égalité à la limite, LIMIT en coupe une arbitrairement. Ajoutez une colonne de départage (comme l'id) dans le ORDER BY.
SELECT * FROM commandes ORDER BY date_commande DESC LIMIT 3;SELECT * FROM commandes ORDER BY date_commande DESC, id DESC LIMIT 3;Exercices
Essayez d'écrire la requête vous-même avant d'ouvrir la solution.
Défi 1. Affichez les 3 employés les mieux payés (prénom, nom, salaire).
Voir une solution
SELECT prenom, nom, salaire FROM employes ORDER BY salaire DESC LIMIT 3;| prenom | nom | salaire |
|---|---|---|
| Chloé | Dubois | 9 500 |
| Nathan | Roux | 6 800 |
| Jade | Lefebvre | 6 200 |
3 lignes au total
Essayer dans le bac à sableDéfi 2. Affichez les clients 11 à 20 par ordre alphabétique de nom.
Voir une solution
SELECT nom, prenom FROM clients ORDER BY nom, prenom LIMIT 10 OFFSET 10;| nom | prenom |
|---|---|
| Bernard | Lucas |
| Bernard | Samir |
| Blanc | Lucas |
| Blanc | Lucas |
| Blanc | Léa |
| Blanc | Rayan |
| Blanc | Sarah |
| Bonnet | Chloé |
10 lignes au total · 8 affichées
Essayer dans le bac à sableLes exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.
Questions fréquentes
Quel est l'équivalent de LIMIT en SQL Server ?
SELECT TOP 5 colonnes FROM table, ou la syntaxe standard OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY après un ORDER BY.
Peut-on écrire LIMIT 10, 5 ?
Oui en SQLite et MySQL : c'est l'ancienne syntaxe LIMIT décalage, nombre. Elle équivaut à LIMIT 5 OFFSET 10, plus lisible.
OFFSET est-il efficace sur de grandes tables ?
Pas toujours : pour atteindre la page 1000, la base doit quand même parcourir toutes les lignes précédentes. Les applications à fort volume paginent plutôt à partir de la dernière valeur vue (WHERE id > dernier_id).