Laisse-moi te poser une question : qu'est-ce que tu fais quand tu tombes sur trop de produits sur une seule page d'un site e-commerce ? Exact, tu ouvres la page suivante. Mais qu'est-ce qui se passe derrière le rideau ? C'est la magie du SQL — la commande OFFSET est utilisée pour sauter des lignes. Aujourd'hui tu vas voir c'est quoi OFFSET, à quoi ça sert, comment l'utiliser et pourquoi c'est la base de la pagination des données.
OFFSET — c'est un mot-clé en SQL qui te permet de zapper un certain nombre de lignes dans les résultats d'une requête. C'est comme tourner les pages d'un bouquin : tu peux "sauter" les 10 premières lignes et commencer à lire à partir de la 11ème.
Syntaxe
SELECT colonne1, colonne2
FROM table
OFFSET nombre_de_lignes;
OFFSET— mot-clé pour sauter des lignes.- nombre_de_lignes — combien de lignes tu veux zapper.
Exemple simple d'utilisation de OFFSET
Imaginons qu'on a une table students avec les données suivantes :
| id | name | age |
|---|---|---|
| 1 | Alisa | 22 |
| 2 | Bob | 24 |
| 3 | Klara | 23 |
| 4 | Dan | 21 |
| 5 | Eva | 25 |
On veut afficher tous les étudiants à partir du troisième. Pour ça, on peut utiliser la requête :
SELECT *
FROM students
OFFSET 2;
Résultat :
| id | name | age |
|---|---|---|
| 3 | Klara | 23 |
| 4 | Dan | 21 |
| 5 | Eva | 25 |
SQL a "zappé" les deux premières lignes (Alisa et Bob) et a sorti le résultat à partir de la troisième. C'est comme avec un marque-page : "cette page on l'a déjà lue, on passe à la suivante".
Combiner OFFSET avec LIMIT
OFFSET est souvent utilisé avec LIMIT. Ça permet de sauter des lignes ET de limiter le résultat à un certain nombre d'enregistrements. Super utile pour faire de la pagination (page = page) — afficher les données par petits bouts, quelques lignes à la fois.
Imaginons qu'on veut afficher 2 enregistrements à la fois et commencer à partir de la troisième ligne. La requête sera :
SELECT *
FROM students
LIMIT 2
OFFSET 2;
Résultat :
| id | name | age |
|---|---|---|
| 3 | Klara | 23 |
| 4 | Dan | 21 |
Comment ça marche :
OFFSET 2saute les deux premières lignes : Alisa et Bob.LIMIT 2prend juste deux lignes parmi celles qui restent.
Construire la pagination
On arrive à la partie la plus cool — la pagination. Imagine que tu fais une appli web avec une liste d'étudiants. Sur chaque page tu veux afficher 2 enregistrements. Comment faire ?
Principe de base :
- Première page : on saute 0 lignes :
OFFSET 0. - Deuxième page : on saute 2 lignes :
OFFSET 2. - Troisième page : on saute 4 lignes :
OFFSET 4. - Et ainsi de suite...
Exemple : affiche la deuxième page
Sur la première page, on a les enregistrements 1 et 2 (Alisa et Bob). Sur la deuxième page — les enregistrements 3 et 4 (Klara et Dan).
SELECT *
FROM students
ORDER BY id
LIMIT 2
OFFSET 2;
Résultat :
| id | name | age |
|---|---|---|
| 3 | Klara | 23 |
| 4 | Dan | 21 |
Exemple : affiche la troisième page
Sur la troisième page — enregistrements 5 et 6 (s'ils existent).
SELECT *
FROM students
ORDER BY id
LIMIT 2
OFFSET 4;
Résultat :
| id | name | age |
|---|---|---|
| 5 | Eva | 25 |
Formule pour calculer OFFSET
Pour faire de la pagination auto, tu peux utiliser cette formule :
OFFSET = (numero_de_page - 1) * nombre_d_enregistrements_par_page
Par exemple :
- Pour la première page :
(1 - 1) * 2 = 0. - Pour la deuxième page :
(2 - 1) * 2 = 2. - Pour la troisième page :
(3 - 1) * 2 = 4.
Remarques importantes sur la performance
Quand tu bosses avec des grosses tables, utiliser OFFSET peut devenir lent, surtout sur les pages du fond. Pourquoi ? Parce que PostgreSQL parcourt quand même toutes les lignes qu'il doit sauter. Par exemple, une requête avec OFFSET 10000 oblige la BDD à lire les 10 000 premières lignes avant de sortir le résultat. Dans ces cas-là, tu peux regarder d'autres solutions, genre utiliser un identifiant unique comme marqueur de pagination.
Alternative : pagination avec un curseur
Pour optimiser, tu peux utiliser la technique du "curseur". Au lieu de sauter des lignes avec OFFSET, tu mémorises l'id de la dernière ligne reçue sur la page précédente, et tu t'en sers pour la requête suivante :
SELECT *
FROM students
WHERE id > dernier_id_affiche
ORDER BY id
LIMIT 2;
Cette méthode peut vraiment accélérer les requêtes sur de grosses tables.
Utilisation pratique de la pagination
La pagination est utilisée dans la plupart des applis web : boutiques en ligne, blogs, panneaux d'admin. Par exemple :
- Afficher la liste des produits dans une boutique en ligne ;
- Afficher la liste des utilisateurs dans un CRM ;
- Afficher les news page par page.
La pagination peut aussi servir quand tu analyses de grosses quantités de données, pour bosser par petits bouts.
Erreurs classiques avec OFFSET
Bosser avec OFFSET peut parfois être galère, surtout quand tu débutes. Voilà quelques erreurs fréquentes :
Pas de tri. Si tu oublies ORDER BY, l'ordre des lignes dans les résultats de OFFSET peut être chelou.
Mauvaise requête :
SELECT * FROM students
OFFSET 5;
Bonne requête :
SELECT * FROM students
ORDER BY id
OFFSET 5;
Valeur OFFSET incorrecte. Si tu mets une valeur trop grande, tu auras un résultat vide.
Problèmes de performance. Comme on l'a vu plus haut, utiliser un gros OFFSET sur les dernières pages peut être lent.
Pas de filtres. Si tu utilises OFFSET et LIMIT sans filtre (WHERE), tu risques de récupérer des données inutiles, ce qui peut ralentir la requête.
Ordre des opérateurs. L'ordre des opérateurs SQL est strict : d'abord LIMIT, puis OFFSET. Tu peux en omettre, mais pas changer l'ordre.
GO TO FULL VERSION