LIMIT

Les limites en SQL

15/06/2008 14717 lectures 1 commentaire 4/5 (10 votes)
Nous allons maintenant nous pencher sur une notion pratique du SQL : les limites. Avant de nous lancer dans l'explication de la nature de cette notion, nous allons citer un exemple dans lequel les limites sont importantes.

Imaginez que vous disposez d'un livre d'or comme celui présent sur ce site. Sur la première page, vous êtes censé récupérer les 10 premiers messages de votre table contenant les commentaires. Avec ce que nous avons vu pour l'instant, vous feriez un SELECT * qui vous renverrait tous les commentaires, et puis, dans votre script PHP (imaginons que ce soit le langage que vous utilisez), vous n'afficherez que les 10 premiers messages. Pratiquement, cela fonctionne, mais pourquoi renvoyer 300 enregistrements quand on veut en récupérer seulement 10 ? Les limites servent donc à délimiter le nombre d'enregistrements renvoyés.

Nous allons séparer ce cours en 2 parties, parce que, alors que MySql permet de réaliser cela rapidement, il faut réellement se casser la tête avec MS SQL Server.

MySql



La clause permettant d'appliquer une limite à un résultat est LIMIT. Cette clause se rajoute à la fin d'une requête SELECT. Voici la syntaxe de cette clause :



Comme vous le voyez, cette clause prend 2 paramètres dont le premier est optionel. Ce paramètre sert à définir à partir de quelle ligne la sélection se fera. Si ce paramètre n'est pas spécifié, la sélection commencera à la première ligne du résultat renvoyé. Le second paramètre, quant à lui, permet de définir combien de ligne maximum seront retournées. Imaginons la table suivante :

Image


Voici comment vous pourriez récupérer les 3 premiers enregistrements :



Le résultat renvoyé contiendra donc les 3 premières lignes de la table. Effectivement, le premier paramètre n'ayant pas été spécifié, la sélection des lignes commence à la première ligne du résultat renvoyé. Ensuite, juste les 3 premières lignes (désignées par le second paramètre de LIMIT) seront renvoyées. Imaginez maintenant cette requête :



Le résultat renvoyé sera celui-ci :

Image


Comme vous le voyez, le résultat comporte encore 3 lignes, mais ce ne sont plus les 3 premières. Effectivement, le premier paramètre a maintenant été précisé, ce qui fait que la sélection des lignes à renvoyer s'est effectuée à partir de la ligne après la ligne 2, donc la troisième, le résultat est donc les 3 lignes se trouvant après la deuxième. C'est ainsi que vous pourrez faire des systèmes de pagination pour, par exemple, un livre d'or.

MS SQL Server



Comme nous l'avons vu précédemment, il est beaucoup plus difficile de faire des limites avec MS SQL Server, tout simplement car elles n'existent pas. Il y a bien une manière de le faire, mais elle est assez tordue et lourde. Nous allons voir cela par un exemple. Imaginez que vous avez la table suivante :

Image


Nous allons voir une requête générale permettant de simuler une clause de limite. Elle sera parfois un peu trop complexe pour la limite à appliquer mais aura le mérite d'être appliquable pour tous les cas de figure. Voici donc comment récupérer les 3 premiers enregistrements d'un résultat :



C'est impressionnant de voir qu'il est obligatoire de passer par ce genre de requête pour simuler à peu près ce que LIMIT peut faire en MySql. Enfin bon... Cette requête ne fait pas exactement la même chose que LIMIT en Mysql. Effectivement, son comportement sera, dans 90% des cas, similaire, sauf quand la sélection se fait sur la fin de la table. Effectivement, imaginons que nous voulions récupérer maximum 5 enregistrements d'une table à partir du 15ème enregistrement. Si la table contient 16 enregitrement, LIMIT ne vous renverra qu'une seule ligne (la dernière), alors que la requête précédente vous renverra les 5 derniers enregistrements de la table.

Nous n'allons pas nous étendre sur cela, nous allons juste regarder comment fonctionne cette requête. TOP sert à récupérer les x premiers enregistrements renvoyés par une requête. Il se place directement après le mot-clé SELECT et doit directement être suivi du nombre d'enregistrement à garder. Nous allons ici étudier cette requête en partant du SELECT le plus imbriqué, à savoir :



Le 3 désigne ici le nombre maximum d'enregistrement à renvoyer alors que le 0 désigne à partir de quelle ligne les lignes seront sélectionnées. Donc ici, nous récupérerons les 3 lignes suivant la ligne 0. Mais nous ne les récupérons pas n'importe comment. Nous les trions dans l'ordre croissant par rapport au champ ID_PERSONNE. Regardons maintenant le deuxième SELECT :



Nous faisons simplement une sélection des champs ID_PERSONNE, NOM, PRENOM et AGE sur la table renvoyée par le SELECT expliqué précédemment. Nous nommons cette table R1 grâce au mot clé AS et nous trions les résultats renvoyés en ordre décroissant selon le champ ID_PERSONNE. Nous ne sélectionnons que 3 lignes car c'est le maximum de ligne autorisée. Voyons maintenant le dernier sélect :



Ici, nous ne faisons que récupérer les champs ID_PERSONNE, NOM, PRENOM et AGE depuis la table renvoyée par le SELECT précédent et nous retrions dans l'ordre croissant les lignes renvoyées.

L'explication maintenant terminée, nous allons voir petit à petit comment cela se passe. Le but ici, sera de récupérer les 3 enregistrements suivant l'enregistrement 2. Imaginez la table suivante :

Image


Le premier SELECT :



Renverra ceci :

Image


Ici, nous avons donc récupérer les 5 premiers enregistrements de la table grâce au mot-clé TOP, et nous les avons triés par ordre croissant. Le deuxième SELECT va maintenant s'appliquer sur ce résultat :



Pour donner ceci :

Image


Comme vous le voyez, les résultats voulus sont bien renvoyés. Le TOP va s'appliquer APRÈS le ORDER BY, autrement dit, les résultats vont être tous renversés et on va récupérer les 3 premiers enregistrements. Il va donc maintenant juste falloir récupérer les champs qui nous intérèssent et re-trier le résultat dans l'ordre croissant pour les remettre dans le bon sens. Nous appliquons donc le dernier SELECT :



Pour récupérer :

Image


Les résultats obtenus sont bien ceux recherchés. Le principe est donc le suivant :

Il y a toujours une limite supérieure des résultats à récupérer. Si nous voulons récupérer les 3 enregistrements suivant le deuxième, la limite sera 5 (3 + 2), nous commençons donc par récupérer les 5 premiers enregistrements. Ensuite, nous les renversons en les triant avec le mot-clé DESC. Une fois le renversement effectué, nous récupérons les enregistrements que nous voulons, donc ici, nous en voulons 3. Donc c'est bien les trois derniers des 5 premiers qui seront récupérés, ce sera donc en fait les 3 enregistrements suivant le deuxième. Une fois la sélection effectuée, il suffit de re-trier dans l'ordre croissant les résultats récupérés pour remettre de l'ordre dans tout ça.

Voter :

1 commentaires

  • Maxence a dit:

    22/10/2011

    Super !

Ajouter un commentaire