Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Limitare le righe restituite in una query di SQL Server utilizzando la clausola TOP

In SQL Server puoi usare TOP clausola per limitare le righe restituite da un set di risultati di query. Questa clausola fornisce funzionalità simili a LIMIT in MySQL e ROWNUM in Oracle, sebbene ci siano differenze nel modo in cui ciascuno di questi funziona.

Di seguito sono riportati esempi di utilizzo di TOP clausola per limitare il set di risultati in SQL Server.

Esempio 1 – Utilizzo di base

Ecco un esempio di base di come TOP funziona:

SELECT TOP(3) * 
FROM Albums;

Risultato:

+-----------+-----------------------+---------------+------------+-----------+
| 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 questo caso ho limitato i risultati a sole tre righe.

Eseguiamo nuovamente la query, ma questa volta senza il TOP clausola:

SELECT * 
FROM Albums;

Risultato:

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

Quindi possiamo vedere che la prima query ha restituito solo le prime tre da un insieme più ampio.

Esempio 2 – Utilizzo della clausola ORDER BY

Microsoft afferma che è consigliabile utilizzare sempre ORDER BY quando si utilizza il TOP clausola. Questo perché è l'unico modo per indicare in modo prevedibile quali righe sono interessate da TOP .

Pertanto, potremmo riscrivere il primo esempio come segue:

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

Risultato:

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

È importante capire in che modo l'ordine influisce sui risultati. Altrimenti potresti finire con risultati inaspettati.

Ecco cosa succede se utilizzo di nuovo la stessa query, ma ordino in base a una colonna diversa:

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

Risultato:

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

Inserimento, eliminazione e aggiornamento in ordine

Nota che, sebbene tu possa usare il TOP clausola in INSERT , UPDATE , MERGE e DELETE istruzioni, non puoi specificare direttamente il ORDER BY clausola in queste affermazioni. Tuttavia, puoi utilizzare un'istruzione sub-select per inserire, eliminare o modificare le righe in un ordine cronologico significativo.

Esempio 3 – Utilizzo dell'argomento WITH TIES

Puoi usare il WITH TIES opzionale argomento per restituire tutte le righe che si legano all'ultimo posto nel set di risultati limitato. Questo è applicabile (e può essere utilizzato solo) quando si utilizza il ORDER BY clausola.

Se il ORDER BY La clausola fa sì che due o più righe si leghino per l'ultimo posto, utilizzando WITH TIES , farà sì che tutti vengano restituiti. Ciò può causare la restituzione di più righe di quelle effettivamente specificate.

Questo è più facile spiegato con un esempio.

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

Risultato:

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

Qui, specifico che devono essere restituite solo le prime 3 righe, ma in realtà ne vengono restituite 5. Questo perché ci sono 5 righe che usano lo stesso ArtistId, quindi le righe 3 – 5 sono tutte in parità per l'ultimo posto. In questo caso utilizzo WITH TIES per restituirli tutti.

Se rimuovo WITH TIES , vengono restituite solo 3 righe:

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

Risultato:

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

Nota che il WITH TIES l'argomento può essere specificato solo in SELECT istruzioni e solo se utilizzano il ORDER BY clausola. Inoltre, l'ordine restituito per legare i record è arbitrario.

Esempio 4 – Utilizzo delle percentuali

Hai anche la possibilità di specificare un valore percentuale invece di un determinato numero di righe. Per fare ciò, usa il PERCENT argomento.

Esempio:

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

Risultato:

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

Si noti che i valori frazionari vengono arrotondati per eccesso al valore intero successivo. In questo caso, il 10 percento di 22 righe è 2,2, ma poiché è stato arrotondato per eccesso, si ottengono 3 righe.

Quindi raddoppiare la percentuale non comporterà necessariamente il doppio del numero di righe:

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

Risultato:

+-----------+------------------------+---------------+------------+-----------+
| 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 questo caso, il 20 percento di 22 è 4,4. Ancora una volta, viene arrotondato per eccesso e otteniamo 5 righe.

Esempio 5 – Rimozione delle parentesi

È possibile rimuovere le parentesi quando si utilizza il TOP clausola, tuttavia, non è consigliata.

Ad ogni modo, ecco un esempio di rimozione delle parentesi dall'esempio precedente:

SELECT TOP 20 PERCENT * 
FROM Albums
ORDER BY AlbumId;

Risultato:

+-----------+------------------------+---------------+------------+-----------+
| 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 consiglia di utilizzare sempre le parentesi, poiché fornisce coerenza con l'utilizzo richiesto in INSERT , UPDATE , MERGE e DELETE dichiarazioni.

Le parentesi sono facoltative per motivi di compatibilità con le versioni precedenti.