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.