LIMIT / OFFSET
LIMIT garde les n premières lignes du résultat trié, OFFSET en saute m avant de commencer. C'est l'outil des classements (top 3) et de la pagination d'une liste dans une application.
- pagination
- top
- premiers résultats
- FETCH FIRST
- TOP
Syntaxe
SELECT colonnesFROM tableORDER BY colonneLIMIT n [OFFSET m];Exemple
SELECT name, priceFROM productsORDER BY price DESCLIMIT 2 OFFSET 2;-- Jeu de données : boutique-- Page 2 d'un catalogue affiché par 2 produits, du plus cher au moins cher-- Résultat attendu :-- Enceinte Bluetooth | 79.99-- Webcam HD | 59.99À retenir
- Page p de taille t : LIMIT t OFFSET (p - 1) × t. La page 3 de 10 éléments s'écrit LIMIT 10 OFFSET 20.
- Syntaxes concurrentes : LIMIT dans SQLite, PostgreSQL et MySQL, SELECT TOP n ou OFFSET m ROWS FETCH NEXT n ROWS ONLY dans SQL Server, FETCH FIRST n ROWS ONLY en SQL standard (accepté aussi par PostgreSQL).
- Piège : sans ORDER BY, LIMIT renvoie des lignes quelconques, et deux pages successives peuvent se chevaucher.
- Piège : LIMIT coupe arbitrairement entre deux ex æquo. Pour un vrai « top 3 » qui garde les égalités, utilisez RANK() (voir la fiche sur le classement).
- Sur une grande table, OFFSET 100000 oblige le moteur à lire puis jeter 100 000 lignes. Préférez la pagination par clé : WHERE id > dernier_id_vu ORDER BY id LIMIT 20.
Voir aussi
- ORDER BYORDER BY trie le résultat final, croissant par défaut (ASC) ou décroissant (DESC). Plusieurs colonnes servent à départager les ex æquo, par exemple le prix puis le nom.
- SELECTSELECT est la question posée à la base : quelles colonnes afficher et depuis quelle table (FROM). C'est le point de départ de toute requête de lecture, du simple listing au rapport.
- ROW_NUMBER, RANK, DENSE_RANKLes fonctions de classement numérotent les lignes selon un tri, éventuellement par groupe. Elles répondent aux questions de type « top N par catégorie » qu'un simple LIMIT ne sait pas traiter.