Maintenez SQLtest en vie : Aidez à couvrir les coûts du serveur de ce mois-ci de 100 $ pour garder toutes les leçons et le terrain de jeu SQL en ligne. Soutenez le projet →
Code SQL copié dans le presse-papiers

Leçon 2.6 · Temps de lecture : ~5 min

La clause SQL LIMIT limite le nombre de lignes renvoyées par une requête, et OFFSET saute un certain nombre de lignes avant de renvoyer le reste. Dans cette leçon, vous apprendrez à obtenir les N premières lignes, à construire une pagination, pourquoi LIMIT a besoin d'ORDER BY et comment les autres SGBD écrivent la même chose.

SQL LIMIT et OFFSET : les N premières lignes et la pagination

Les tables contiennent souvent des milliers ou des millions de lignes, et on en a rarement besoin de toutes à la fois. Un rapport veut les 10 premiers éléments, une application affiche 20 résultats par page. LIMIT et OFFSET renvoient exactement la tranche du résultat dont vous avez besoin.

SQL LIMIT et OFFSET : dans un résultat trié, OFFSET saute des lignes et LIMIT prend les suivantes, pour les listes top-N et la pagination

La clause LIMIT

LIMIT fixe le nombre maximal de lignes du résultat. Elle s'écrit à la fin de la requête, après ORDER BY.

Syntaxe de base

SELECT column1, column2, ...
FROM table_name
ORDER BY column_name
LIMIT row_count;
SELECT title, length
FROM film
ORDER BY length DESC
LIMIT 5;

Résultat : les 5 films les plus longs.


Pourquoi LIMIT a besoin d'ORDER BY

Sans ORDER BY, la base de données renvoie les lignes dans l'ordre qui l'arrange, donc « les 5 premières lignes » peuvent être différentes à chaque fois. Triez toujours avant de limiter.

Le tri doit aussi être univoque. Dans la requête ci-dessus, plusieurs films ont la même durée de 185 minutes, et c'est la base de données qui décide lesquels entrent dans le top 5. Ajoutez une colonne qui départage les égalités :

SELECT title, length
FROM film
ORDER BY length DESC, title
LIMIT 5;

Résultat : les 5 films les plus longs ; les films de même durée sont triés par titre, le résultat est donc identique à chaque exécution.


La clause OFFSET

OFFSET saute un nombre donné de lignes avant que LIMIT ne commence à compter :

SELECT actor_id, first_name, last_name
FROM actor
ORDER BY actor_id
LIMIT 5 OFFSET 10;

Résultat : les acteurs 11 à 15 selon actor_id : les 10 premières lignes sont sautées et les 5 suivantes sont renvoyées.

MySQL et MariaDB acceptent aussi la forme courte LIMIT 10, 5, où le premier nombre est le décalage et le second le nombre de lignes. La forme explicite LIMIT 5 OFFSET 10 est plus lisible et fonctionne aussi dans PostgreSQL et SQLite.


Pagination avec LIMIT et OFFSET

La pagination découpe un long résultat en pages. Pour la page N avec S lignes par page :

  • LIMIT S
  • OFFSET (N - 1) * S
Page10 lignes par page
1LIMIT 10 OFFSET 0 (lignes 1–10)
2LIMIT 10 OFFSET 10 (lignes 11–20)
3LIMIT 10 OFFSET 20 (lignes 21–30)
SELECT film_id, title
FROM film
ORDER BY title, film_id
LIMIT 10 OFFSET 20;

Résultat : la page 3 de la liste des films triée par titre.

La base de données lit et saute quand même toutes les lignes du décalage, donc les très grands décalages (page 10 000) deviennent lents. Pour une pagination profonde, les applications mémorisent généralement la dernière valeur de la page précédente et filtrent avec WHERE.


LIMIT dans les autres SGBD

LIMIT est pris en charge par MySQL, MariaDB, PostgreSQL et SQLite. Les autres SGBD utilisent une syntaxe différente :

SGBD5 premières lignes
MySQL, MariaDB, PostgreSQL, SQLiteLIMIT 5
SQL ServerSELECT TOP 5 ... ou OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY
Oracle 12c+, PostgreSQL, norme SQLFETCH FIRST 5 ROWS ONLY

Points clés :

  • LIMIT n renvoie au plus n lignes.
  • OFFSET n saute n lignes avant de renvoyer le résultat.
  • Utilisez toujours LIMIT avec ORDER BY, et rendez le tri univoque pour un résultat stable.
  • Page N de S lignes : LIMIT S OFFSET (N - 1) * S.
  • SQL Server utilise TOP, et la norme SQL FETCH FIRST n ROWS ONLY.

Questions fréquentes

Quelle est la différence entre LIMIT et OFFSET ?

LIMIT fixe combien de lignes renvoyer ; OFFSET fixe combien de lignes sauter d'abord. LIMIT 5 OFFSET 10 saute 10 lignes et renvoie les 5 suivantes.

Quel est l'équivalent de LIMIT dans SQL Server ?

SELECT TOP 5 ... pour les premières lignes, ou ORDER BY ... OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY pour la pagination.

Pourquoi une requête avec LIMIT renvoie-t-elle des lignes différentes à chaque fois ?

Parce que la requête n'a pas d'ORDER BY, ou que les colonnes de tri contiennent des valeurs égales. Triez par des colonnes qui identifient chaque ligne de façon unique, par exemple en ajoutant la clé primaire comme dernière clé de tri.

Essayez de resoudre les exercices suivants pour consolider ce que vous avez appris dans cette lecon.

  1. Dix premiers films par ordre alphabétique
  2. Liste triée des films avec limite
  3. Liste des films — troisième page
  4. Obtenir le film le plus long