sql >> Database >  >> RDS >> Sqlserver

Beperk de rijen die in een SQL Server-query worden geretourneerd met behulp van de TOP-clausule

In SQL Server kunt u de TOP . gebruiken om de rijen te beperken die worden geretourneerd door een set met queryresultaten. Deze clausule biedt vergelijkbare functionaliteit als LIMIT in MySQL, en ROWNUM in Oracle, hoewel er verschillen zijn in hoe elk van deze werkt.

Hieronder staan ​​voorbeelden van het gebruik van de TOP clausule om de resultaatset in SQL Server te beperken.

Voorbeeld 1 – Basisgebruik

Hier is een eenvoudig voorbeeld van hoe TOP werkt:

SELECT TOP(3) * 
FROM Albums;

Resultaat:

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

In dit geval heb ik de resultaten beperkt tot slechts drie rijen.

Laten we de query opnieuw uitvoeren, maar deze keer zonder de TOP clausule:

SELECT * 
FROM Albums;

Resultaat:

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

We kunnen dus zien dat de eerste zoekopdracht alleen de eerste drie van een grotere set retourneerde.

Voorbeeld 2 – Gebruik van de ORDER BY-clausule

Microsoft stelt dat het de beste praktijk is om altijd de ORDER BY . te gebruiken bij gebruik van de TOP clausule. Dit is omdat het de enige manier is om voorspelbaar aan te geven welke rijen worden beïnvloed door TOP .

Daarom zouden we het eerste voorbeeld als volgt kunnen herschrijven:

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

Resultaat:

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

Het is belangrijk om te begrijpen hoe de volgorde de resultaten beïnvloedt. Anders kunt u onverwachte resultaten krijgen.

Dit is wat er gebeurt als ik dezelfde zoekopdracht opnieuw gebruik, maar in een andere kolom bestel:

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

Resultaat:

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

In volgorde invoegen, verwijderen en bijwerken

Merk op dat, hoewel u de TOP . kunt gebruiken clausule in INSERT , UPDATE , MERGE , en DELETE instructies, kunt u de ORDER BY . niet direct specificeren clausule in deze verklaringen. U kunt echter een subselectie-instructie gebruiken om rijen in een zinvolle chronologische volgorde in te voegen, te verwijderen of te wijzigen.

Voorbeeld 3 – Het WITH TIES-argument gebruiken

U kunt de optionele WITH TIES . gebruiken argument om alle rijen terug te geven die gelijk zijn voor de laatste plaats in de beperkte resultaatset. Dit is alleen van toepassing (en kan alleen worden gebruikt) bij gebruik van de ORDER BY clausule.

Als de ORDER BY clausule zorgt ervoor dat twee of meer rijen gelijk eindigen voor de laatste plaats, met behulp van WITH TIES , zal ervoor zorgen dat ze allemaal worden geretourneerd. Dit kan ertoe leiden dat er meer rijen worden geretourneerd dan u daadwerkelijk opgeeft.

Dit is makkelijker uit te leggen met een voorbeeld.

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

Resultaat:

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

Hier specificeer ik dat alleen de bovenste 3 rijen moeten worden geretourneerd, maar dat er daadwerkelijk 5 worden geretourneerd. Dit komt omdat er 5 rijen zijn die dezelfde ArtistId gebruiken, en dus rijen 3 – 5 allemaal voor de laatste plaats. In dit geval gebruik ik WITH TIES om ze allemaal terug te sturen.

Als ik WITH TIES verwijder , worden slechts 3 rijen geretourneerd:

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

Resultaat:

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

Merk op dat de WITH TIES argument kan alleen worden opgegeven in SELECT instructies, en alleen als ze de ORDER BY . gebruiken clausule. Ook is de volgorde van het koppelen van records willekeurig.

Voorbeeld 4 – Percentages gebruiken

U heeft ook de mogelijkheid om een ​​percentage op te geven in plaats van een vast aantal rijen. Gebruik hiervoor de PERCENT argument.

Voorbeeld:

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

Resultaat:

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

Merk op dat fractionele waarden naar boven worden afgerond op het volgende gehele getal. In dit geval is 10 procent van 22 rijen 2,2, maar omdat het naar boven is afgerond, eindigen we met 3 rijen.

Dus een verdubbeling van het percentage leidt niet noodzakelijk tot een verdubbeling van het aantal rijen:

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

Resultaat:

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

In dit geval is 20 procent van 22 4,4. Nogmaals, het wordt naar boven afgerond en we krijgen 5 rijen.

Voorbeeld 5 – De haakjes verwijderen

Het is mogelijk om de haakjes te verwijderen bij gebruik van de TOP clausule wordt echter niet aanbevolen.

Hoe dan ook, hier is een voorbeeld van het verwijderen van de haakjes uit het vorige voorbeeld:

SELECT TOP 20 PERCENT * 
FROM Albums
ORDER BY AlbumId;

Resultaat:

+-----------+------------------------+---------------+------------+-----------+
| 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 raadt u aan altijd de haakjes te gebruiken, omdat dit consistentie biedt met het vereiste gebruik in INSERT , UPDATE , MERGE , en DELETE verklaringen.

De haakjes zijn optioneel vanwege achterwaartse compatibiliteit.


  1. SqlServer:Inloggen mislukt voor gebruiker

  2. Heroku Postgres:psql:FATAL:geen pg_hba.conf invoer voor host

  3. Hoe voer je meerdere SQL-commando's uit in een enkele SQL-verbinding?

  4. Equivalent van SQL Server aan Sleep():de WAITFOR-instructie