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.