sql >> Databasteknik >  >> RDS >> Sqlserver

Begränsa raderna som returneras i en SQL Server-fråga genom att använda TOP-satsen

I SQL Server kan du använda TOP sats för att begränsa raderna som returneras från en frågeresultatuppsättning. Den här klausulen tillhandahåller liknande funktionalitet som LIMIT i MySQL och ROWNUM i Oracle, även om det finns skillnader i hur var och en av dessa fungerar.

Nedan finns exempel på hur du använder TOP sats för att begränsa resultatuppsättningen i SQL Server.

Exempel 1 – Grundläggande användning

Här är ett grundläggande exempel på hur TOP fungerar:

SELECT TOP(3) * 
FROM Albums;

Resultat:

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

I det här fallet begränsade jag resultaten till bara tre rader.

Låt oss köra frågan igen, men den här gången utan TOP klausul:

SELECT * 
FROM Albums;

Resultat:

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

Så vi kan se att den första frågan endast returnerade de tre första från en större uppsättning.

Exempel 2 – Användning av ORDER BY-klausulen

Microsoft säger att det är bästa praxis att alltid använda ORDER BY när du använder TOP klausul. Detta beror på att det är det enda sättet att förutsägbart indikera vilka rader som påverkas av TOP .

Därför skulle vi kunna skriva om det första exemplet till följande:

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

Resultat:

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

Det är viktigt att förstå hur beställning påverkar resultatet. Annars kan du få oväntade resultat.

Så här händer om jag använder samma fråga igen, men sorterar efter en annan kolumn:

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

Resultat:

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

Infoga, ta bort och uppdatera i ordning

Observera att även om du kan använda TOP sats i INSERT , UPDATE , MERGE och DELETE uttalanden kan du inte direkt ange ORDER BY klausul i dessa uttalanden. Du kan dock använda en sub-select-sats för att infoga, ta bort eller ändra rader i en meningsfull kronologisk ordning.

Exempel 3 – Använda WITH TIES-argumentet

Du kan använda den valfria WITH TIES argument för att returnera alla rader som liknar sista plats i den begränsade resultatuppsättningen. Detta är endast tillämpligt (och kan endast användas) när du använder ORDER BY klausul.

Om ORDER BY klausul gör att två eller flera rader blir lika för sista plats, med WITH TIES , kommer att göra att alla returneras. Detta kan leda till att fler rader returneras än du faktiskt anger.

Detta är lättare att förklara med ett exempel.

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

Resultat:

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

Här specificerar jag att endast de 3 översta raderna ska returneras, men 5 returneras faktiskt. Detta beror på att det finns 5 rader som använder samma ArtistId, och så raderna 3 – 5 stämmer överens om sista plats. I det här fallet använder jag WITH TIES att lämna tillbaka dem alla.

Om jag tar bort WITH TIES , endast 3 rader returneras:

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

Resultat:

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

Observera att WITH TIES argument kan endast anges i SELECT satser, och endast om de använder ORDER BY klausul. Den returnerade ordningen för att koppla poster är också godtycklig.

Exempel 4 – Använda procentsatser

Du har också möjlighet att ange ett procentvärde istället för ett visst antal rader. För att göra detta, använd PERCENT argument.

Exempel:

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

Resultat:

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

Observera att bråkvärden avrundas uppåt till nästa heltalsvärde. I det här fallet är 10 procent av 22 rader 2,2, men eftersom det avrundades uppåt får vi 3 rader.

Så att dubbla procentandelen kommer inte nödvändigtvis att resultera i dubbla antalet rader:

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

Resultat:

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

I det här fallet är 20 procent av 22 4,4. Återigen rundas det uppåt och vi får 5 rader.

Exempel 5 – Ta bort parenteserna

Det är möjligt att ta bort parenteserna när du använder TOP klausul, men det rekommenderas inte.

Hur som helst, här är ett exempel på att ta bort parenteserna från föregående exempel:

SELECT TOP 20 PERCENT * 
FROM Albums
ORDER BY AlbumId;

Resultat:

+-----------+------------------------+---------------+------------+-----------+
| 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 rekommenderar att du alltid använder parenteserna, eftersom det ger överensstämmelse med dess nödvändiga användning i INSERT , UPDATE , MERGE och DELETE uttalanden.

Parenteserna är valfria av bakåtkompatibilitetsskäl.


  1. Hur man uppdaterar Array i PostgreSQL

  2. Hur kopierar man data från en tabell till en annan ny tabell i MySQL?

  3. Varför kan det bara finnas en TIMESTAMP-kolumn med CURRENT_TIMESTAMP i DEFAULT-satsen?

  4. Hur lagrar man unicode i MySQL?