sql >> Base de Datos >  >> RDS >> Sqlserver

Limite las filas devueltas en una consulta de SQL Server utilizando la cláusula TOP

En SQL Server, puede usar el TOP cláusula para limitar las filas devueltas de un conjunto de resultados de consulta. Esta cláusula proporciona una funcionalidad similar a LIMIT en MySQL, y ROWNUM en Oracle, aunque existen diferencias en el funcionamiento de cada uno de ellos.

A continuación se muestran ejemplos del uso de TOP cláusula para limitar el conjunto de resultados en SQL Server.

Ejemplo 1:uso básico

Este es un ejemplo básico de cómo TOP funciona:

SELECT TOP(3) * 
FROM Albums;

Resultado:

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

En este caso, limité los resultados a solo tres filas.

Ejecutemos la consulta de nuevo, pero esta vez sin TOP cláusula:

SELECT * 
FROM Albums;

Resultado:

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

Entonces podemos ver que la primera consulta devolvió solo los tres primeros de un conjunto más grande.

Ejemplo 2:uso de la cláusula ORDER BY

Microsoft afirma que es una buena práctica usar siempre el ORDER BY al usar el TOP cláusula. Esto se debe a que es la única forma de indicar de manera predecible qué filas se ven afectadas por TOP .

Por lo tanto, podríamos reescribir el primer ejemplo de la siguiente manera:

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

Resultado:

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

Es importante entender cómo el orden afecta los resultados. De lo contrario, podría terminar con resultados inesperados.

Esto es lo que sucede si vuelvo a utilizar la misma consulta, pero ordeno por una columna diferente:

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

Resultado:

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

Inserción, eliminación y actualización en orden

Tenga en cuenta que, aunque puede utilizar el TOP cláusula en INSERT , UPDATE , MERGE y DELETE declaraciones, no puede especificar directamente el ORDER BY cláusula en estas declaraciones. Sin embargo, puede usar una declaración de subselección para insertar, eliminar o modificar filas en un orden cronológico significativo.

Ejemplo 3:uso del argumento CON LAZOS

Puedes usar el WITH TIES opcional argumento para devolver todas las filas que empatan en el último lugar en el conjunto de resultados limitado. Esto solo es aplicable (y solo se puede usar) cuando se usa ORDER BY cláusula.

Si el ORDER BY cláusula hace que dos o más filas empaten en el último lugar, usando WITH TIES , hará que todos ellos sean devueltos. Esto puede hacer que se devuelvan más filas de las que realmente especifica.

Esto se explica más fácilmente con un ejemplo.

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

Resultado:

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

Aquí, especifico que solo se deben devolver las 3 filas superiores, pero en realidad se devuelven 5. Esto se debe a que hay 5 filas que usan el mismo ArtistId, por lo que las filas 3 a 5 están empatadas en el último lugar. En este caso uso WITH TIES para devolverlos a todos.

Si elimino WITH TIES , solo se devuelven 3 filas:

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

Resultado:

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

Tenga en cuenta que el WITH TIES el argumento solo se puede especificar en SELECT declaraciones, y solo si usan el ORDER BY cláusula. Además, el orden devuelto de los registros de vinculación es arbitrario.

Ejemplo 4:uso de porcentajes

También tiene la opción de especificar un valor porcentual en lugar de un número determinado de filas. Para hacer esto, use el PERCENT argumento.

Ejemplo:

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

Resultado:

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

Tenga en cuenta que los valores fraccionarios se redondean al siguiente valor entero. En este caso, el 10 por ciento de 22 filas es 2,2, pero debido a que se redondeó, terminamos con 3 filas.

Entonces, duplicar el porcentaje no necesariamente resultará en el doble de filas:

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

Resultado:

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

En este caso, el 20 por ciento de 22 es 4,4. Una vez más, se redondea hacia arriba y obtenemos 5 filas.

Ejemplo 5:quitar los paréntesis

Es posible eliminar los paréntesis cuando se usa TOP cláusula, sin embargo, no se recomienda.

De cualquier manera, aquí hay un ejemplo de cómo eliminar los paréntesis del ejemplo anterior:

SELECT TOP 20 PERCENT * 
FROM Albums
ORDER BY AlbumId;

Resultado:

+-----------+------------------------+---------------+------------+-----------+
| 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 recomienda usar siempre los paréntesis, ya que proporciona coherencia con su uso requerido en INSERT , UPDATE , MERGE y DELETE declaraciones.

Los paréntesis son opcionales por motivos de compatibilidad con versiones anteriores.