MySQL LIMITE ET DÉCALAGE avec exemples

⚡ Résumé intelligent

Le MySQL Le mot-clé LIMIT limite le nombre de lignes renvoyées par une requête, et la valeur OFFSET détermine la ligne de départ du résultat. Ensemble, ils permettent de réduire la taille des résultats, d'accélérer le chargement des pages et de gérer la pagination enregistrement par enregistrement.

  • (I.e. Comportement fondamental : LIMIT N renvoie au maximum N lignes. Une table contenant moins de lignes que N les renvoie toutes, sans erreur.
  • 0️⃣ Cas zéro : La commande LIMIT 0 ne renvoie aucune ligne, ce qui en fait un moyen économique d'inspecter les métadonnées des colonnes.
  • 📍 Syntaxe de décalage : LIMIT 1, 2 saute une ligne et en renvoie deux, donc le décalage est écrit en premier et le nombre de lignes en second.
  • 📄 Formule de pagination : OFFSET est égal à la taille de la page multipliée par le numéro de page moins un, ce qui transforme un ensemble de résultats en pages numérotées.
  • ️ Dépendance à l'ordre : Sans ORDER BY, MySQL peut renvoyer des lignes différentes à chaque exécution, donc LIMIT n'est déterministe qu'avec un tri explicite.
  • ⚙️ Soutien à la déclaration : LIMIT limite également le nombre de lignes affectées par UPDATE et DELETE, protégeant ainsi une grande table contre une écriture illimitée.
  • ???? Avertissement concernant les performances : Un décalage important rend MySQL Lisez et ignorez chaque ligne sautée, de sorte que les pages profondes s'agrandissent plus lentement.

MySQL LIMITE et DÉCALAGE

Quel est le mot-clé LIMIT dans MySQL?

Le LIMIT Le mot-clé `LIMIT` limite le nombre de lignes renvoyées dans le résultat d'une requête. Il peut être utilisé avec les instructions SELECT, UPDATE et DELETE, et limite ainsi le nombre de lignes lues par une requête ainsi que le nombre de lignes affectées par une écriture.

La syntaxe du mot-clé LIMIT est la suivante.

SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;

ICI. (en anglais seulement)

  • « SÉLECTIONNER {nom(s) de champ | *} DEPUIS nom(s) de table" est le Instruction SELECT contenant les champs que nous souhaitons renvoyer dans notre requête.
  • "[OÙ condition]" est facultatif, mais lorsqu'il est fourni, il spécifie un filtre sur l'ensemble de résultats. clause O est appliqué avant LIMIT, le filtrage a donc lieu en premier et la limite est appliquée à ce qui reste.
  • « LIMITE N » est le mot-clé, et N N représente n'importe quel nombre à partir de 0. Si la limite est fixée à 0, aucun enregistrement ne sera retourné. Si la limite est fixée à 5, cinq enregistrements seront retournés. Si la table contient moins d'enregistrements que N, ils seront tous retournés et aucune erreur ne sera signalée.

La syntaxe est concise, mais il convient d'expliquer sa raison d'être avant de donner les exemples.

Pourquoi devrions-nous utiliser le mot-clé LIMIT ?

Supposons que nous soyons en développementping L'application s'exécute sur myflixdb. Les concepteurs du système nous ont demandé de limiter à 20 le nombre d'enregistrements affichés par page afin d'optimiser les temps de chargement. Comment mettre en œuvre un système répondant à cette contrainte ?

Le mot-clé LIMIT gère précisément ce cas de figure. Au lieu d'importer chaque ligne de membre dans l'application et d'en supprimer la plupart, la requête renvoie 20 enregistrements par page, laissant le soin à la base de données de traiter les données. Il en découle trois avantages.

  • Réponse plus rapide : Moins de données sont lues sur le disque et moins de données transitent par le réseau.
  • Utilisation de la mémoire réduite : L'application contient une seule page de lignes, et non le tableau entier.
  • Safer écrit : une LIMITE sur une MISE À JOUR ou une EFFACER Cette instruction limite le nombre de lignes qu'une erreur peut affecter.

MySQL Exemples de requêtes LIMIT

Les exemples ci-dessous sont exécutés sur la table « members » de la base de données myflixdb. Le premier renvoie deux lignes, et rien de plus.

SELECT * FROM members LIMIT 2;
numéro de membre noms complets le sexe date_de_naissance date_d_enregistrement adresse physique adresse postale numéro de contact en nous envoyant un mail Numéro de Carte de Crédit
1 Janet Jones femme 21-07-1980 NULL Terrain de la première rue n° 4 Sac privé 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones femme 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL

Comme le montre le résultat ci-dessus, seuls deux membres ont été renvoyés.

Récupération d'une liste de dix (10) membres à partir de la base de données

Supposons que nous souhaitions obtenir la liste des 10 premiers membres inscrits dans la base de données Myflix. Le script ci-dessous permet de les obtenir.

SELECT * FROM members LIMIT 10;

L'exécution du script donne le résultat indiqué ci-dessous.

numéro de membre noms complets le sexe date_de_naissance date_d_enregistrement adresse physique adresse postale numéro de contact en nous envoyant un mail Numéro de Carte de Crédit
1 Janet Jones femme 21-07-1980 NULL Terrain de la première rue n° 4 Sac privé 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones femme 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Masculin 12-07-1989 NULL 3e rue 34 NULL 12345 rm@tstreet.com NULL
4 Gloria Williams femme 14-02-1984 NULL 2e rue 23 NULL NULL NULL NULL
5 Léonard Hofstadter Masculin NULL NULL Crête des bois NULL 845738767 NULL NULL
6 Sheldon Cooper Masculin NULL NULL Crête des bois NULL 976736763 NULL NULL
7 Rajesh Koothrappali Masculin NULL NULL Crête des bois NULL 938867763 NULL NULL
8 Leslie Winkel Masculin 14-02-1984 NULL Crête des bois NULL 987636553 NULL NULL
9 Howard Wolowitz Masculin 24-08-1981 NULL Parc du Sud Tel: 4563 987786553 lwolowitz[at]email.me NULL

Seuls 9 membres ont été retournés, car N dans la clause LIMIT est supérieur au nombre d'enregistrements dans la table. Demander explicitement 9 lignes produit le même résultat.

SELECT * FROM members LIMIT 9;

Astuce : LIMIT sélectionne les lignes dans l'ordre où le serveur les renvoie. Ajoutez un COMMANDÉ PAR clause chaque fois que l'identité des rangs importe, sinon « les 10 premiers membres » ne garantit pas de désigner deux fois les mêmes neuf personnes.

Limiter le nombre de lignes constitue la première partie de la fonctionnalité. Choisir le point de départ de la fenêtre constitue la seconde.

Utilisation de la valeur OFFSET dans la requête LIMIT

Le OFFSET La valeur est le plus souvent utilisée avec le mot-clé LIMIT. Elle spécifie la ligne à partir de laquelle le serveur commence à récupérer les données ; les lignes précédentes sont ignorées.

Supposons que nous souhaitions limiter le nombre de membres à partir du milieu du tableau. Le script ci-dessous commence à la deuxième ligne et limite le résultat à deux enregistrements.

SELECT * FROM `members` LIMIT 1, 2;

L'exécuter dans MySQL Workbench La requête contre la base de données myflixdb donne le résultat suivant.

numéro de membre noms complets le sexe date_de_naissance date_d_enregistrement adresse physique adresse postale numéro de contact en nous envoyant un mail Numéro de Carte de Crédit
2 Janet Smith Jones femme 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Masculin 12-07-1989 NULL 3e rue 34 NULL 12345 rm@tstreet.com NULL

Notez qu'ici DÉCALAGE = 1, la ligne n°2 est donc la première ligne renvoyée, et LIMITE = 2, donc seuls 2 enregistrements ont été retournés.

Sous cette forme à deux arguments, le décalage est écrit en premier et le nombre de lignes en second, ce qui peut facilement être inversé par erreur. MySQL Elle accepte également une forme explicite qui lève l'ambiguïté, et c'est celle qu'il faut privilégier dans le nouveau code.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Les deux instructions renvoient les mêmes deux lignes. Le décalage étant compris, le modèle de pagination sur lequel repose chaque écran de liste en découle directement.

Comment paginer les résultats d'une requête avec LIMIT et OFFSET

La pagination divise un grand ensemble de résultats en pages numérotées ; les fonctions LIMIT et OFFSET permettent cette division. Chaque requête de page dépend de deux valeurs : la taille de la page, c’est-à-dire le nombre d’enregistrements affichés à l’écran, et le numéro de page demandé par l’utilisateur.

Le décalage est calculé à partir de ces données à l'aide d'une formule unique.

-- OFFSET = page_size * (page_number - 1)
SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 0;   -- page 1

La page 2 conserve la même limite et décale le décalage d'une page.

SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 20;  -- page 2

Trois règles permettent de garantir une pagination correcte et rapide.

  1. Toujours trier : Une requête paginée sans ORDER BY peut afficher le même enregistrement sur deux pages différentes et en masquer un autre complètement, car le serveur est libre de modifier l'ordre des lignes entre les appels.
  2. Trier sur une colonne unique : En cas d'égalité dans la colonne de tri, l'ordre des lignes concernées reste indéfini. Trier selon la clé primaire, ou l'ajouter comme critère de départage, résout ce problème.
  3. Consultez les pages profondes : DÉCALAGE 100000 forces MySQL Il faut lire cent mille lignes et les ignorer avant d'en afficher les vingt suivantes. Le temps de réponse augmente avec le numéro de page.

Pour une pagination très profonde, la pagination par ensemble de clés évite complètement le décalage. Au lieu de compter les lignes à ignorer, la requête conserve la dernière clé de la page précédente et demande les lignes suivantes.

SELECT membership_number, full_names
FROM members
WHERE membership_number > 20      -- last id from the previous page
ORDER BY membership_number ASC
LIMIT 20;

Ce format reste rapide quelle que soit la profondeur, car l'index accède directement à la clé de départ au lieu de parcourir les lignes précédentes. En contrepartie, les pages doivent être parcourues séquentiellement.ping L'accès direct à la page 500 n'est plus possible.

LIMITE dans MySQL contre TOP et FETCH FIRST

L'instruction LIMIT ne fait pas partie de tous les dialectes SQL, ce qui a son importance dès lors qu'une requête doit être transférée entre différents moteurs de base de données. MySQL, PostgreSQL et SQLite SQL Server utilise le mot-clé LIMIT. SQL Server utilise TOP et TOP. Oracle utilise la clause FETCH FIRST standard. Le tableau ci-dessous compare les trois.

Clause Moteur Exemple Saute des lignes
LIMITE … DÉCALAGE MySQL, PostgreSQL, SQLite SÉLECTIONNER * DE membres LIMITE 20 DÉCALAGE 40; Oui, avec OFFSET
TOP SQL Server SÉLECTIONNER LES 20 MEILLEURS * DE membres ; Non, OFFSET… FETCH est requis
RÉCUPÉRER EN PREMIER Oracle, Db2, SQL standard SELECT * FROM members FETCH FIRST 20 ROWS ONLY; Oui, avec OFFSET… ROWS

Le comportement est identique dans tous les cas : limiter le nombre de lignes et, éventuellement, en ignorer certaines au préalable. Seule la formulation diffère. Une requête devant s’exécuter sur plusieurs moteurs de recherche doit donc isoler la clause de limitation du nombre de lignes plutôt que de la disperser dans le code.

FAQ

Oui. Les deux acceptent un simple nombre de lignes, comme : EFFACER FROM members LIMIT 10. La forme de décalage à deux arguments n'est pas autorisée ici, donc seul le nombre de lignes affectées peut être limité.

Le décalage commence à zéro ; ainsi, OFFSET 0 correspond à la première ligne et OFFSET 1 à la deuxième. Le numéro de ligne est une valeur numérique simple, lisible comme un nombre normal.

Exécutez une requête SELECT COUNT(*) distincte avec la même clause WHERE, mais sans LIMIT. La requête COUNT indique à l'application le nombre total de pages, tandis que la requête LIMIT renvoie les lignes de la page courante.

Souvent, oui. Les assistants IA intégrés à des clients tels que MySQL Workbench Réécrivez une requête OFFSET en une clause WHERE sur la dernière clé rencontrée. Vérifiez que la colonne de tri est unique et indexée avant de valider la réécriture.

Parce que l'instruction générée omet généralement ORDER BY. Sans tri explicite, MySQL La fonction LIMIT peut renvoyer les lignes dans n'importe quel ordre ; par conséquent, une même commande LIMIT peut produire un échantillon différent à chaque exécution. Ajoutez vous-même le tri.

Résumez cet article avec :