V SQL Server můžete použít TOP
klauzule k omezení řádků vrácených ze sady výsledků dotazu. Tato klauzule poskytuje podobnou funkci jako LIMIT
v MySQL a ROWNUM
v Oracle, i když existují rozdíly v tom, jak každý z nich funguje.
Níže jsou uvedeny příklady použití TOP
klauzule k omezení sady výsledků na serveru SQL.
Příklad 1 – Základní použití
Zde je základní příklad toho, jak TOP
funguje:
SELECT TOP(3) * FROM Albums;
Výsledek:
+-----------+-----------------------+---------------+------------+-----------+ | 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 | +-----------+-----------------------+---------------+------------+-----------+
V tomto případě jsem omezil výsledky na pouhé tři řádky.
Spusťte dotaz znovu, ale tentokrát bez TOP
klauzule:
SELECT * FROM Albums;
Výsledek:
+-----------+--------------------------+---------------+------------+-----------+ | 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 | +-----------+--------------------------+---------------+------------+-----------+
Můžeme tedy vidět, že první dotaz vrátil pouze první tři z větší sady.
Příklad 2 – Použití klauzule ORDER BY
Společnost Microsoft uvádí, že je osvědčeným postupem vždy používat ORDER BY
při použití TOP
doložka. Je to proto, že je to jediný způsob, jak předvídatelně určit, které řádky jsou ovlivněny TOP
.
Proto bychom mohli přepsat první příklad na následující:
SELECT TOP(3) * FROM Albums ORDER BY AlbumId;
Výsledek:
+-----------+-----------------------+---------------+------------+-----------+ | 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 | +-----------+-----------------------+---------------+------------+-----------+
Je důležité pochopit, jak pořadí ovlivňuje výsledky. Jinak byste mohli skončit s neočekávanými výsledky.
Co se stane, když znovu použiji stejný dotaz, ale seřadím podle jiného sloupce:
SELECT TOP(3) * FROM Albums ORDER BY ArtistId;
Výsledek:
+-----------+-------------------+---------------+------------+-----------+ | 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 | +-----------+-------------------+---------------+------------+-----------+
Vkládání, mazání a aktualizace v objednávce
Všimněte si, že i když můžete použít TOP
klauzule v INSERT
, UPDATE
, MERGE
a DELETE
příkazy, nemůžete přímo zadat ORDER BY
klauzule v těchto prohlášeních. Můžete však použít příkaz sub-select k vložení, odstranění nebo úpravě řádků ve smysluplném chronologickém pořadí.
Příklad 3 – Použití argumentu WITH TIES
Můžete použít volitelné WITH TIES
argument k vrácení všech řádků, které se shodují na posledním místě v omezené sadě výsledků. To platí pouze (a lze jej použít pouze) při použití ORDER BY
doložka.
Pokud ORDER BY
klauzule způsobí, že dva nebo více řádků se spojí na posledním místě pomocí WITH TIES
, způsobí, že budou vráceny všechny. To může způsobit, že bude vráceno více řádků, než ve skutečnosti určíte.
To se snadněji vysvětluje na příkladu.
SELECT TOP(3) WITH TIES * FROM Albums ORDER BY ArtistId;
Výsledek:
+-----------+-------------------------+---------------+------------+-----------+ | 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 | +-----------+-------------------------+---------------+------------+-----------+
Zde upřesňuji, že by měly být vráceny pouze horní 3 řádky, ale ve skutečnosti je vráceno 5. Je to proto, že existuje 5 řad používajících stejné ArtistId, takže řady 3 – 5 jsou všechny shodné na posledním místě. V tomto případě používám WITH TIES
aby je všechny vrátil.
Pokud odeberu WITH TIES
, jsou vráceny pouze 3 řádky:
SELECT TOP(3) * FROM Albums ORDER BY ArtistId;
Výsledek:
+-----------+-------------------+---------------+------------+-----------+ | 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 | +-----------+-------------------+---------------+------------+-----------+
Všimněte si, že WITH TIES
argument lze zadat pouze v SELECT
a pouze v případě, že používají příkaz ORDER BY
doložka. Také vrácené pořadí svazování záznamů je libovolné.
Příklad 4 – Použití procent
Máte také možnost zadat procentuální hodnotu namísto nastaveného počtu řádků. Chcete-li to provést, použijte PERCENT
argument.
Příklad:
SELECT TOP(10) PERCENT * FROM Albums ORDER BY AlbumId;
Výsledek:
+-----------+-----------------------+---------------+------------+-----------+ | 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 | +-----------+-----------------------+---------------+------------+-----------+
Všimněte si, že zlomkové hodnoty jsou zaokrouhleny nahoru na další celé číslo. V tomto případě je 10 procent z 22 řádků 2,2, ale protože to bylo zaokrouhleno nahoru, skončíme se 3 řádky.
Zdvojnásobení procenta tedy nemusí nutně vést k dvojnásobnému počtu řádků:
SELECT TOP(20) PERCENT * FROM Albums ORDER BY AlbumId;
Výsledek:
+-----------+------------------------+---------------+------------+-----------+ | 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 | +-----------+------------------------+---------------+------------+-----------+
V tomto případě je 20 procent z 22 4,4. Opět se zaokrouhlí nahoru a dostaneme 5 řádků.
Příklad 5 – Odstranění závorek
Při použití TOP
je možné závorky odstranit klauzule se však nedoporučuje.
Ať tak či onak, zde je příklad odstranění závorek z předchozího příkladu:
SELECT TOP 20 PERCENT * FROM Albums ORDER BY AlbumId;
Výsledek:
+-----------+------------------------+---------------+------------+-----------+ | 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 | +-----------+------------------------+---------------+------------+-----------+
Společnost Microsoft doporučuje, abyste vždy používali závorky, protože poskytují konzistenci s požadovaným použitím v INSERT
, UPDATE
, MERGE
a DELETE
prohlášení.
Závorky jsou volitelné z důvodů zpětné kompatibility.