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