Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Begrenzen Sie die in einer SQL Server-Abfrage zurückgegebenen Zeilen mithilfe der TOP-Klausel

In SQL Server können Sie den TOP verwenden -Klausel, um die Zeilen einzuschränken, die von einem Abfrageergebnissatz zurückgegeben werden. Diese Klausel bietet eine ähnliche Funktionalität wie LIMIT in MySQL und ROWNUM in Oracle, obwohl es Unterschiede in der Funktionsweise gibt.

Nachfolgend finden Sie Beispiele für die Verwendung von TOP -Klausel, um die Ergebnismenge in SQL Server einzuschränken.

Beispiel 1 – Grundlegende Verwendung

Hier ist ein einfaches Beispiel dafür, wie TOP funktioniert:

SELECT TOP(3) * 
FROM Albums;

Ergebnis:

+-----------+-----------------------+---------------+------------+-----------+
| 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         |
+-----------+-----------------------+---------------+------------+-----------+

In diesem Fall habe ich die Ergebnisse auf nur drei Zeilen beschränkt.

Lassen Sie uns die Abfrage erneut ausführen, diesmal jedoch ohne TOP Klausel:

SELECT * 
FROM Albums;

Ergebnis:

+-----------+--------------------------+---------------+------------+-----------+
| 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         |
+-----------+--------------------------+---------------+------------+-----------+

Wir können also sehen, dass die erste Abfrage nur die ersten drei aus einer größeren Menge zurückgegeben hat.

Beispiel 2 – Verwendung der ORDER BY-Klausel

Microsoft gibt an, dass es sich bewährt hat, immer den ORDER BY zu verwenden bei Verwendung des TOP Klausel. Dies liegt daran, dass nur so vorhersehbar angegeben werden kann, welche Zeilen von TOP betroffen sind .

Daher könnten wir das erste Beispiel wie folgt umschreiben:

SELECT TOP(3) * 
FROM Albums
ORDER BY AlbumId;

Ergebnis:

+-----------+-----------------------+---------------+------------+-----------+
| 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         |
+-----------+-----------------------+---------------+------------+-----------+

Es ist wichtig zu verstehen, wie sich die Reihenfolge auf die Ergebnisse auswirkt. Andernfalls könnten Sie mit unerwarteten Ergebnissen enden.

Folgendes passiert, wenn ich dieselbe Abfrage erneut verwende, aber nach einer anderen Spalte sortiere:

SELECT TOP(3) * 
FROM Albums
ORDER BY ArtistId;

Ergebnis:

+-----------+-------------------+---------------+------------+-----------+
| 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         |
+-----------+-------------------+---------------+------------+-----------+

Einfügen, Löschen und Aktualisieren in der Reihenfolge

Beachten Sie, dass Sie zwar den TOP verwenden können -Klausel in INSERT , UPDATE , MERGE , und DELETE -Anweisungen können Sie ORDER BY nicht direkt angeben Klausel in diesen Aussagen. Sie können jedoch eine Sub-Select-Anweisung verwenden, um Zeilen in einer sinnvollen chronologischen Reihenfolge einzufügen, zu löschen oder zu ändern.

Beispiel 3 – Verwendung des WITH TIES-Arguments

Sie können den optionalen WITH TIES verwenden -Argument, um alle Zeilen zurückzugeben, die in der begrenzten Ergebnismenge den letzten Platz einnehmen. Dies gilt nur (und kann nur verwendet werden), wenn der ORDER BY verwendet wird Klausel.

Wenn der ORDER BY -Klausel bewirkt, dass zwei oder mehr Zeilen mit WITH TIES um den letzten Platz gebunden werden , bewirkt, dass alle zurückgegeben werden. Dies kann dazu führen, dass mehr Zeilen zurückgegeben werden, als Sie tatsächlich angeben.

Anhand eines Beispiels lässt sich dies leichter erklären.

SELECT TOP(3) WITH TIES *
FROM Albums
ORDER BY ArtistId;

Ergebnis:

+-----------+-------------------------+---------------+------------+-----------+
| 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         |
+-----------+-------------------------+---------------+------------+-----------+

Hier gebe ich an, dass nur die obersten 3 Zeilen zurückgegeben werden sollen, aber tatsächlich 5 zurückgegeben werden. Dies liegt daran, dass es 5 Zeilen mit derselben ArtistId gibt, sodass die Zeilen 3 bis 5 alle den letzten Platz einnehmen. In diesem Fall verwende ich WITH TIES sie alle zurückzugeben.

Wenn ich WITH TIES entferne , werden nur 3 Zeilen zurückgegeben:

SELECT TOP(3) *
FROM Albums
ORDER BY ArtistId;

Ergebnis:

+-----------+-------------------+---------------+------------+-----------+
| 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         |
+-----------+-------------------+---------------+------------+-----------+

Beachten Sie, dass WITH TIES Argument kann nur in SELECT angegeben werden -Anweisungen, und nur dann, wenn sie den ORDER BY verwenden Klausel. Außerdem ist die zurückgegebene Reihenfolge der Verknüpfung von Datensätzen willkürlich.

Beispiel 4 – Prozentsätze verwenden

Sie haben auch die Möglichkeit, anstelle einer festen Zeilenanzahl einen Prozentwert anzugeben. Verwenden Sie dazu den PERCENT Argument.

Beispiel:

SELECT TOP(10) PERCENT * 
FROM Albums
ORDER BY AlbumId;

Ergebnis:

+-----------+-----------------------+---------------+------------+-----------+
| 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         |
+-----------+-----------------------+---------------+------------+-----------+

Beachten Sie, dass Bruchwerte auf den nächsten ganzzahligen Wert aufgerundet werden. In diesem Fall sind 10 Prozent von 22 Zeilen 2,2, aber da aufgerundet wurde, erhalten wir am Ende 3 Zeilen.

Das Verdoppeln des Prozentsatzes führt also nicht unbedingt zu einer doppelten Anzahl von Zeilen:

SELECT TOP(20) PERCENT * 
FROM Albums
ORDER BY AlbumId;

Ergebnis:

+-----------+------------------------+---------------+------------+-----------+
| 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         |
+-----------+------------------------+---------------+------------+-----------+

In diesem Fall sind 20 Prozent von 22 4,4. Wieder wird aufgerundet und wir erhalten 5 Zeilen.

Beispiel 5 – Entfernen der Klammern

Es ist möglich, die Klammern zu entfernen, wenn Sie den TOP verwenden Klausel, wird jedoch nicht empfohlen.

So oder so, hier ist ein Beispiel für das Entfernen der Klammern aus dem vorherigen Beispiel:

SELECT TOP 20 PERCENT * 
FROM Albums
ORDER BY AlbumId;

Ergebnis:

+-----------+------------------------+---------------+------------+-----------+
| 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 empfiehlt, dass Sie immer die Klammern verwenden, da dies für Konsistenz mit der erforderlichen Verwendung in INSERT sorgt , UPDATE , MERGE , und DELETE Aussagen.

Die Klammern sind aus Gründen der Abwärtskompatibilität optional.