L’ OFFSET SQL est la position à partir de laquelle les données vont être sélectionnées et le mot-clé SQL LIMIT correspond au nombre de résultats que la requête va renvoyer. Les bases de données contiennent souvent des milliers de lignes de données. Une requête SELECT retourne toutes ces lignes dans leur ordre naturel de stockage. La clause LIMIT sélectionne uniquement le nombre précis d’enregistrements souhaité dans le résultat final.
Table des matières
Syntaxe de base SQL pour la clause SQL LIMIT
Cette clause limite le nombre de lignes retournées par une requête de sélection. Elle s’écrit toujours en fin de requête après FROM, WHERE et ORDER BY. LIMIT accepte un seul nombre entier représentant la limite maximale. La requête suivante affiche les 5 produits les moins chers et ORDER BY trie d’abord par prix croissant.
SELECT field1, field2
FROM table
ORDER BY field1 ASC
LIMIT 5;
Pagination avec OFFSET
La pagination divise les résultats des requêtes en pages successives pour l’affichage web. OFFSET détermine le point de départ dans le résultat trié. LIMIT et OFFSET fonctionnent ensemble pour créer des pages numérotées. La formule générale calcule OFFSET comme (numéro_page – 1) multiplié par taille de la page. Cette méthode crée une navigation fluide entre les pages.
-- Page 1 : lignes 1-10
SELECT nom FROM clients ORDER BY nom LIMIT 10 OFFSET 0;
-- Page 2 : lignes 11-20
SELECT nom FROM clients ORDER BY nom LIMIT 10 OFFSET 10;
-- Page 3 : lignes 21-30
SELECT nom FROM clients ORDER BY nom LIMIT 10 OFFSET 20;
OFFSET devient lent sur de très gros volumes. La base de données SQL compte toutes les lignes sautées à chaque requête. Les techniques de pagination par curseur améliorent les performances sur des millions de lignes.
Les différences entre SGBD
MySQL, PostgreSQL et SQLite utilisent un LIMIT et OFFSET standard tandis que SQL Server et Oracle proposent des syntaxes propriétaires alternatives.
MySQL, PostgreSQL, SQLite
Ces SGBDR adoptent la syntaxe LIMIT OFFSET universelle ce qui facilite la portabilité des requêtes. Cette syntaxe sélectionne les lignes 21 à 30 du classement.
SELECT * FROM produits
ORDER BY prix
LIMIT 10 OFFSET 20;
SQL Server (TOP et OFFSET/FETCH)
SQL Server utilise TOP pour les limites simples. La syntaxe moderne OFFSET FETCH remplace progressivement TOP qui convient mieux aux limites petites et simples alors que OFFSET FETCH gère la pagination professionnelle. Les deux syntaxes coexistent dans SQL Server actuellement.
-- TOP simple
SELECT TOP 10 nom FROM clients ORDER BY nom;
-- OFFSET/FETCH moderne
SELECT nom FROM clients
ORDER BY nom
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;
Oracle (ROWNUM et FETCH FIRST)
Oracle utilise les deux, la syntaxe historiques et la syntaxe moderne. ROWNUM limite les résultats bruts et FETCH FIRST représente la norme SQL:2008. ROWNUM applique la limite avant tri, créant des résultats incorrects. FETCH FIRST trie d’abord puis limite. Oracle 12c+ privilégie cette syntaxe moderne.
-- ROWNUM ancien
SELECT * FROM (SELECT nom FROM clients ORDER BY nom)
WHERE ROWNUM <= 10;
-- FETCH moderne
SELECT nom FROM clients
ORDER BY nom
FETCH FIRST 10 ROWS ONLY;
Exemples LIMIT pratiques
Top ventes du mois
Cette requête identifie les 5 produits les plus vendus en janvier. GROUP BY synthétise d’abord les quantités par produit et LIMIT 5 sélectionne les meilleures performances du mois.
SELECT produit, SUM(quantite) AS total_vendu
FROM ventes
WHERE MONTH(date) = 1 AND YEAR(date) = 2026
GROUP BY produit
ORDER BY total_vendu DESC
LIMIT 5;
Dernières commandes clients
Cette requête affiche les 10 commandes les plus récentes avec nom client. ORDER BY DESC priorise les dates actuelles, la jointure assemble les informations complémentaires.
SELECT c.nom, com.date, com.montant
FROM clients c
JOIN commandes com ON c.id = com.client_id
ORDER BY com.date DESC
LIMIT 10;
Pagination pour la recherche avancée
Cette requête pagine la recherche de produits électroniques entre 50 et 200 euros. OFFSET 40 correspond à la troisième page de 20 éléments mais les filtres WHERE réduisent d’abord le volume de données.
SELECT p.nom, p.prix, c.nom AS categorie
FROM produits p
JOIN categories c ON p.categorie_id = c.id
WHERE p.prix BETWEEN 50 AND 200
AND c.nom = 'Electronique'
ORDER BY p.nom ASC
LIMIT 20 OFFSET 40;
Pièges courants avec LIMIT
Le piège le plus fréquent est l’oubli de la clause ORDER BY avant LIMIT. La clause LIMIT retourne alors les lignes dans l’ordre physique arbitraire du disque. Sans ORDER BY, la même requête produit des résultats différents à chaque exécution et crée un classement déterministe.
-- ⚠️ ORDRE IMPRÉVISIBLE
SELECT nom FROM clients LIMIT 10;
-- ✅ ORDRE STABLE
SELECT nom FROM clients ORDER BY nom LIMIT 10;
Une valeur d’offset élevée ralentit considérablement les performances sur de gros volumes. La base de données relationnelle compte toutes les lignes sautées à chaque requête. La requête suivante examine presque toutes les lignes avant de limiter. Les techniques de curseur par ID améliorent drastiquement les performances.
-- LENT sur 1M lignes (OFFSET 990000)
SELECT * FROM clients ORDER BY id LIMIT 10 OFFSET 990000;
SQL Server provoque des erreurs de syntaxe avec LIMIT. Cette clause n’existe pas dans la syntaxe Transact-SQL standard.
-- ❌ ERREUR SQL Server
SELECT * FROM clients LIMIT 10;
-- ✅ SQL Server
SELECT TOP 10 * FROM clients ORDER BY nom;
Bonnes pratiques LIMIT professionnelles
Les bonnes pratiques pour LIMIT optimisent les performances et assurent la cohérence des résultats. Associez toujours LIMIT à ORDER BY avec une clé primaire en dernière position. Cette technique crée une pagination parfaitement stable et performante. ORDER BY nom trie alphabétiquement, id départage les doublons. L’index combiné nom+id accélère la requête et convient mieux aux catalogues volumineux.
-- PAGINATION OPTIMALE
SELECT id, nom, ville
FROM clients
ORDER BY nom ASC, id ASC
LIMIT 20 OFFSET 40;
Utilisez la pagination par curseur sur des millions de lignes. La clause OFFSET compte toutes les lignes précédentes à chaque page. Cette approche recherche directement après le dernier ID affiché. Les performances restent constantes quelle que soit la taille de la page.
-- PAGINATION CURSEUR (id > dernier_id)
SELECT * FROM produits
WHERE id > 1500
ORDER BY id
LIMIT 20;
Créez des index sur les colonnes utilisées avec ORDER BY + LIMIT. Un index nom,ville,id évite l’accès aux données principales. Testez toujours les performances OFFSET sur volumes réels. Une page 1000 peut passer de 0,1s à 30s. Les métriques de performance guident les choix d’optimisation.
Exercice pratique pagination
Testez votre compréhension avec cet exercice concret de pagination.
Contexte : Table produits (id, nom, prix). Pagination 15 produits par page, tri par prix puis nom.
Exercice 1 : Page 4 (lignes 46-60) :
SELECT id, nom, prix
FROM produits
ORDER BY _________ ASC, _________ ASC
LIMIT 15 OFFSET _____;
- ✅SELECT id, nom, prix
FROM produits
ORDER BY prix ASC, nom ASC
LIMIT 15 OFFSET 45;
Exercice 2 : Pagination curseur après produit id=45 :
SELECT id, nom, prix
FROM produits
WHERE id > __
ORDER BY prix ASC, nom ASC
LIMIT __;
- ✅SELECT id, nom, prix
FROM produits
WHERE id > 45
ORDER BY prix ASC, nom ASC
LIMIT 15;
Sources: MySql ,Postgres , Sqlite , SQL Server