Problema:
Você gostaria de limitar as linhas em um conjunto de resultados do SQL Server.
Exemplo:
Nosso banco de dados tem uma tabela chamada
toy
com dados nas colunas id
, name
, e price
. id | nome | preço |
---|---|---|
161 | Bicicleta BMX | 200,00 |
121 | O Robô Tobie | 185,50 |
213 | Jogo de pesca | 25,00 |
102 | Quebra-cabeças de animais | 45,80 |
111 | Conjunto de pista de corrida | 126,70 |
233 | Tijolos fáceis | 21.00 |
Vamos selecionar os nomes e preços dos brinquedos. Mas só precisamos ver as primeiras cinco linhas.
Solução 1:
SELECT name, price FROM toy ORDER BY price OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;
Segue o resultado da consulta:
nome | preço |
---|---|
Tijolos fáceis | 21.00 |
Jogo de pesca | 25,00 |
Quebra-cabeças de animais | 45,80 |
Conjunto de pista de corrida | 126,70 |
O Robô Tobie | 185,50 |
Discussão:
Para limitar linhas no conjunto de resultados, use ORDER BY com as cláusulas OFFSET e FETCH opcionais. Primeiro, a consulta classifica as linhas (ORDER BY). Você então informa ao SQL Server qual deve ser a primeira linha no conjunto de resultados (OFFSET...ROWS) e quantas linhas retornar (FETCH...ONLY).
A cláusula OFFSET é colocada imediatamente após ORDER BY. O número inteiro indica a primeira linha a ser contada (no SQL Server, a primeira linha é 0, a segunda linha é 1 etc.), seguida pela palavra-chave ROW ou ROWS. Você pode usar ROW ou ROWS, mas é recomendável usar ROW para 1 linha e ROWS para 0 e várias linhas. Olha a foto:
Em nosso exemplo, classificamos por preço (
ORDER BY price
) e comece a retornar os resultados da primeira linha (OFFSET 0 ROWS
). Em seguida, usamos FETCH com a palavra-chave FIRST. Você pode usar FIRST ou NEXT; é recomendado usar FIRST se você estiver começando da primeira linha sem omitir nenhum registro e NEXT se alguma linha for omitida (ou seja, se o OFFSET for maior que 0). Por fim, temos o número de linhas a serem selecionadas e a palavra-chave ROWS ONLY. Use ROWS ONLY se você estiver retornando várias linhas e ROW ONLY você está limitando o resultado a uma linha. Em nosso exemplo, limitamos a cinco linhas (
FETCH FIRST 5 ROWS ONLY
). Abaixo, temos outra consulta que limita as linhas a cinco, mas começa na quinta linha da tabela (
OFFSET 4 ROWS
):Solução 2:
SELECT name, price FROM toy ORDER BY price OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY;
Segue o resultado da consulta:
nome | preço |
---|---|
O Robô Tobie | 185,50 |
Bicicleta BMX | 200,00 |
Observe que esta consulta retorna apenas duas linhas, não as cinco indicadas. Olha a foto:
Por que apenas duas linhas? Porque esta tabela contém apenas seis registros. Se omitirmos as primeiras quatro linhas e começarmos na linha 5, restam apenas duas linhas.
O SQL Server tem outra maneira de limitar linhas:a cláusula TOP.
Solução 3:
SELECT TOP 3 name, price FROM toy ORDER BY price;
Segue o resultado da consulta:
nome | preço |
---|---|
Tijolos fáceis | 21.00 |
Jogo de pesca | 25,00 |
Quebra-cabeças de animais | 45,80 |
Se você não precisar omitir nenhuma linha, poderá usar a cláusula TOP do SQL Server para limitar as linhas retornadas. É colocado imediatamente após SELECT. A palavra-chave TOP é seguida por um número inteiro que indica o número de linhas a serem retornadas. Em nosso exemplo, pedimos por preço e, em seguida, limitou as linhas retornadas a 3.
Ao contrário do método OFFSET – FETCH, o TOP não requer ORDER BY. Aqui está um exemplo semelhante, mas sem classificar os registros:
Solução 4:
SELECT TOP 3 name, price FROM toy;
Segue o resultado da consulta:
Observe que diferentes registros foram retornados. Normalmente (mas nem sempre) as linhas serão mostradas na ordem em que os registros foram inseridos na tabela.
Recomendamos usar OFFSET e FETCH em vez de TOP, pois OFFSET e FETCH são padrão SQL; TOP é específico para T-SQL.