Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Limiter les lignes renvoyées dans une requête SQL Server à l'aide de la clause TOP

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é.