sql >> Databáze >  >> RDS >> Sqlserver

Omezte řádky vrácené v dotazu SQL Server pomocí klauzule TOP

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.


  1. Seskupování dat pomocí funkcí OVER a PARTITION BY

  2. Zřetězit hodnoty řádků T-SQL

  3. Vybrat dotaz mysql mezi datem?

  4. Podpora transakcí motoru MyIsam