Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Ogranicz liczbę wierszy zwracanych w zapytaniu programu SQL Server za pomocą klauzuli TOP

W SQL Server możesz użyć TOP klauzula ograniczająca liczbę wierszy zwracanych z zestawu wyników zapytania. Ta klauzula zapewnia podobną funkcjonalność do LIMIT w MySQL i ROWNUM w Oracle, chociaż istnieją różnice w sposobie działania każdego z nich.

Poniżej znajdują się przykłady użycia TOP klauzula ograniczająca zestaw wyników w SQL Server.

Przykład 1 – Podstawowe użycie

Oto podstawowy przykład tego, jak TOP działa:

SELECT TOP(3) * 
FROM Albums;

Wynik:

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

W tym przypadku ograniczyłem wyniki do zaledwie trzech wierszy.

Uruchommy zapytanie ponownie, ale tym razem bez TOP klauzula:

SELECT * 
FROM Albums;

Wynik:

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

Widzimy więc, że pierwsze zapytanie zwróciło tylko pierwsze trzy z większego zestawu.

Przykład 2 – Korzystanie z klauzuli ORDER BY

Microsoft twierdzi, że najlepszą praktyką jest zawsze używać ORDER BY podczas korzystania z TOP klauzula. Dzieje się tak, ponieważ jest to jedyny sposób na przewidywalne wskazanie, na które wiersze ma wpływ TOP .

Dlatego możemy przepisać pierwszy przykład w następujący sposób:

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

Wynik:

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

Ważne jest, aby zrozumieć, jak zamawianie wpływa na wyniki. W przeciwnym razie możesz skończyć z nieoczekiwanymi rezultatami.

Oto, co się stanie, jeśli ponownie użyję tego samego zapytania, ale posortuję według innej kolumny:

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

Wynik:

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

Wstawianie, usuwanie i aktualizacja w kolejności

Zauważ, że chociaż możesz użyć TOP klauzula w INSERT , UPDATE , MERGE i DELETE oświadczenia, nie możesz bezpośrednio określić ORDER BY klauzuli w tych oświadczeniach. Możesz jednak użyć instrukcji sub-select, aby wstawić, usunąć lub zmodyfikować wiersze w zrozumiałej kolejności chronologicznej.

Przykład 3 – użycie argumentu Z POWIĄZANIAMI

Możesz użyć opcjonalnego WITH TIES argument, aby zwrócić wszystkie wiersze, które zajmują ostatnie miejsce w ograniczonym zestawie wyników. Ma to zastosowanie (i może być używane tylko) podczas korzystania z ORDER BY klauzula.

Jeśli ORDER BY klauzula powoduje, że dwa lub więcej wierszy jest wiązanych na ostatnie miejsce, używając WITH TIES , spowoduje, że wszystkie zostaną zwrócone. Może to spowodować zwrócenie większej liczby wierszy niż faktycznie określasz.

Łatwiej to wyjaśnić na przykładzie.

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

Wynik:

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

Tutaj określam, że powinny zostać zwrócone tylko 3 górne wiersze, ale w rzeczywistości zwracanych jest 5. Dzieje się tak, ponieważ istnieje 5 wierszy używających tego samego ArtistId, a więc wszystkie wiersze 3-5 wiążą się na ostatnim miejscu. W tym przypadku używam WITH TIES zwrócić je wszystkie.

Jeśli usunę WITH TIES , zwracane są tylko 3 wiersze:

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

Wynik:

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

Zwróć uwagę, że WITH TIES argument można określić tylko w SELECT oświadczenia i tylko wtedy, gdy używają ORDER BY klauzula. Ponadto zwrócona kolejność wiązania rekordów jest dowolna.

Przykład 4 – Używanie procentów

Masz również możliwość określenia wartości procentowej zamiast określonej liczby wierszy. Aby to zrobić, użyj PERCENT argument.

Przykład:

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

Wynik:

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

Zauważ, że wartości ułamkowe są zaokrąglane w górę do następnej liczby całkowitej. W tym przypadku 10 procent z 22 wierszy to 2,2, ale ponieważ zostało zaokrąglone w górę, otrzymujemy 3 wiersze.

Zatem podwojenie wartości procentowej niekoniecznie spowoduje podwojenie liczby wierszy:

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

Wynik:

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

W tym przypadku 20 procent z 22 to 4,4. Po raz kolejny zaokrąglamy w górę i otrzymujemy 5 wierszy.

Przykład 5 – usuwanie nawiasów

Możliwe jest usunięcie nawiasów podczas korzystania z TOP klauzula, jednak nie jest to zalecane.

Tak czy inaczej, oto przykład usuwania nawiasów z poprzedniego przykładu:

SELECT TOP 20 PERCENT * 
FROM Albums
ORDER BY AlbumId;

Wynik:

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

Firma Microsoft zaleca, aby zawsze używać nawiasów, ponieważ zapewnia to spójność z wymaganym użyciem w INSERT , UPDATE , MERGE i DELETE oświadczenia.

Nawiasy są opcjonalne ze względu na kompatybilność wsteczną.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL Server Xml z wieloma przestrzeniami nazw

  2. Jak uzyskać informacje o dacie/godzinie z kolumny TIMESTAMP?

  3. Zresetuj źródło tożsamości po usunięciu rekordów w SQL Server

  4. Unpivot z nazwą kolumny

  5. Scal nakładające się interwały dat