Dans SQL Server, vous pouvez utiliser le TOP
clause pour limiter les lignes renvoyées à partir d'un ensemble de résultats de requête. Cette clause fournit des fonctionnalités similaires à LIMIT
dans MySQL, et ROWNUM
dans Oracle, bien qu'il existe des différences dans le fonctionnement de chacun d'entre eux.
Vous trouverez ci-dessous des exemples d'utilisation du TOP
clause pour limiter le jeu de résultats dans SQL Server.
Exemple 1 - Utilisation de base
Voici un exemple de base de la façon dont TOP
fonctionne :
SELECT TOP(3) * FROM Albums;
Résultat :
+-----------+-----------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-----------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | +-----------+-----------------------+---------------+------------+-----------+
Dans ce cas, j'ai limité les résultats à seulement trois lignes.
Exécutons à nouveau la requête, mais cette fois sans le TOP
clause :
SELECT * FROM Albums;
Résultat :
+-----------+--------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+--------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | | 6 | Epicloud | 2012-09-18 | 5 | 1 | | 7 | Somewhere in Time | 1986-09-29 | 1 | 1 | | 8 | Piece of Mind | 1983-05-16 | 1 | 1 | | 9 | Killers | 1981-02-02 | 1 | 1 | | 10 | No Prayer for the Dying | 1990-10-01 | 1 | 1 | | 11 | No Sound Without Silence | 2014-09-12 | 9 | 4 | | 12 | Big Swing Face | 1967-06-01 | 4 | 2 | | 13 | Blue Night | 2000-11-01 | 12 | 4 | | 14 | Eternity | 2008-10-27 | 12 | 4 | | 15 | Scandinavia | 2012-06-11 | 12 | 4 | | 16 | Long Lost Suitcase | 2015-10-09 | 7 | 4 | | 17 | Praise and Blame | 2010-06-26 | 7 | 4 | | 18 | Along Came Jones | 1965-05-21 | 7 | 4 | | 19 | All Night Wrong | 2002-05-05 | 3 | 2 | | 20 | The Sixteen Men of Tain | 2000-03-20 | 3 | 2 | | 21 | Yo Wassup | 2019-03-12 | 9 | 3 | | 22 | Busted | 1901-05-11 | 9 | 3 | +-----------+--------------------------+---------------+------------+-----------+
Nous pouvons donc voir que la première requête n'a renvoyé que les trois premiers d'un ensemble plus large.
Exemple 2 – Utilisation de la clause ORDER BY
Microsoft déclare qu'il est préférable de toujours utiliser le ORDER BY
lors de l'utilisation du TOP
clause. En effet, c'est le seul moyen d'indiquer de manière prévisible quelles lignes sont affectées par TOP
.
Par conséquent, nous pourrions réécrire le premier exemple comme suit :
SELECT TOP(3) * FROM Albums ORDER BY AlbumId;
Résultat :
+-----------+-----------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-----------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | +-----------+-----------------------+---------------+------------+-----------+
Il est important de comprendre comment la commande affecte les résultats. Sinon, vous pourriez vous retrouver avec des résultats inattendus.
Voici ce qui se passe si j'utilise à nouveau la même requête, mais en triant par une colonne différente :
SELECT TOP(3) * FROM Albums ORDER BY ArtistId;
Résultat :
+-----------+-------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 7 | Somewhere in Time | 1986-09-29 | 1 | 1 | | 8 | Piece of Mind | 1983-05-16 | 1 | 1 | +-----------+-------------------+---------------+------------+-----------+
Insérer, supprimer et mettre à jour dans l'ordre
Notez que, bien que vous puissiez utiliser le TOP
clause dans INSERT
, UPDATE
, MERGE
, et DELETE
instructions, vous ne pouvez pas spécifier directement le ORDER BY
clause dans ces déclarations. Cependant, vous pouvez utiliser une instruction de sous-sélection pour insérer, supprimer ou modifier des lignes dans un ordre chronologique significatif.
Exemple 3 - Utilisation de l'argument AVEC LIENS
Vous pouvez utiliser l'option WITH TIES
argument pour renvoyer toutes les lignes qui sont à égalité pour la dernière place dans le jeu de résultats limité. Ceci n'est applicable (et ne peut être utilisé) que lors de l'utilisation de ORDER BY
clause.
Si le ORDER BY
la clause entraîne l'égalité de deux lignes ou plus pour la dernière place, en utilisant WITH TIES
, entraînera leur retour. Cela peut entraîner le renvoi de plus de lignes que vous n'en spécifiez réellement.
Ceci est plus facile expliqué avec un exemple.
SELECT TOP(3) WITH TIES * FROM Albums ORDER BY ArtistId;
Résultat :
+-----------+-------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 7 | Somewhere in Time | 1986-09-29 | 1 | 1 | | 8 | Piece of Mind | 1983-05-16 | 1 | 1 | | 9 | Killers | 1981-02-02 | 1 | 1 | | 10 | No Prayer for the Dying | 1990-10-01 | 1 | 1 | +-----------+-------------------------+---------------+------------+-----------+
Ici, je précise que seules les 3 premières lignes doivent être renvoyées, mais 5 sont en fait renvoyées. En effet, il y a 5 lignes utilisant le même ArtistId, et donc les lignes 3 à 5 sont toutes à égalité pour la dernière place. Dans ce cas, j'utilise WITH TIES
pour tous les retourner.
Si je supprime WITH TIES
, seules 3 lignes sont renvoyées :
SELECT TOP(3) * FROM Albums ORDER BY ArtistId;
Résultat :
+-----------+-------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 7 | Somewhere in Time | 1986-09-29 | 1 | 1 | | 8 | Piece of Mind | 1983-05-16 | 1 | 1 | +-----------+-------------------+---------------+------------+-----------+
Notez que le WITH TIES
l'argument ne peut être spécifié que dans SELECT
instructions, et seulement si elles utilisent le ORDER BY
clause. De plus, l'ordre renvoyé pour lier les enregistrements est arbitraire.
Exemple 4 - Utilisation de pourcentages
Vous avez également la possibilité de spécifier une valeur en pourcentage au lieu d'un nombre défini de lignes. Pour ce faire, utilisez le PERCENT
arguments.
Exemple :
SELECT TOP(10) PERCENT * FROM Albums ORDER BY AlbumId;
Résultat :
+-----------+-----------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-----------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | +-----------+-----------------------+---------------+------------+-----------+
Notez que les valeurs fractionnaires sont arrondies à la valeur entière supérieure. Dans ce cas, 10 % de 22 lignes équivaut à 2,2, mais comme il a été arrondi, nous nous retrouvons avec 3 lignes.
Ainsi, doubler le pourcentage n'entraînera pas nécessairement le double du nombre de lignes :
SELECT TOP(20) PERCENT * FROM Albums ORDER BY AlbumId;
Résultat :
+-----------+------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | +-----------+------------------------+---------------+------------+-----------+
Dans ce cas, 20 % de 22 est égal à 4,4. Encore une fois, c'est arrondi, et nous obtenons 5 lignes.
Exemple 5 - Suppression des parenthèses
Il est possible de supprimer les parenthèses lors de l'utilisation du TOP
clause, cependant, ce n'est pas recommandé.
Quoi qu'il en soit, voici un exemple de suppression des parenthèses de l'exemple précédent :
SELECT TOP 20 PERCENT * FROM Albums ORDER BY AlbumId;
Résultat :
+-----------+------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | +-----------+------------------------+---------------+------------+-----------+
Microsoft vous recommande de toujours utiliser les parenthèses, car cela assure la cohérence avec son utilisation requise dans INSERT
, UPDATE
, MERGE
, et DELETE
déclarations.
Les parenthèses sont facultatives pour des raisons de rétrocompatibilité.