O TOP é uma cláusula SQL que especifica o número de linhas que devem ser retornadas no resultado de uma consulta.
Este recurso não está disponível em todos os SGBDS, como alternativa podem ser utilizadas as cláusulas LIMIT para MySQL, ROWNUM para Oracle e FIRST para Firebird.
Visão geral
A utilização dessa cláusula é muito comum entre os desenvolvedores, podendo inclusive trabalhar em conjunto a cláusula ORDER BY como opção para trazer o menor ou maior valor de uma determinada coluna, de acordo com o parâmetro da ordenação.
Considere o seguinte cenário em que uma escola possui uma tabela chamada aluno Tabela 1, responsável por armazenar a informação de todos os alunos da instituição, contendo nome, email e a identificação da turma do aluno.
id | nome | id_turma | |
1 | João Fernando | joao@gmail.com | 1 |
2 | Maria Carvalho | maria@gmail.com | 1 |
3 | Bruna dos Santos | bruna@gmail.com | 2 |
4 | Pedro da Silva | pedro@gmail.com | 2 |
5 | Tiago Pereira | tiago@gmail.com | 1 |
Supondo que de todos os registros dessa tabela desejamos retornar apenas os três primeiros, utilizaremos em um SGBD que possua a cláusula TOP, a seguinte consulta:
SELECT
TOP 3
*
FROM
aluno
Note acima que utilizamos a instrução TOP 3 para trazer apenas os três primeiros registros, conforme apresentado na Tabela 2.
id | nome | id_turma | |
1 | João Fernando | joao@gmail.com | 1 |
2 | Maria Carvalho | maria@gmail.com | 1 |
3 | Bruna dos Santos | bruna@gmail.com | 2 |
Sintaxe
SELECT
TOP N
[ coluna1, coluna2, ... | * ]
FROM
[ tabela1, tabela2, ... ]
* Onde N é o número de linhas que serão retornadas.
Na pratica
Exemplo 1
Neste exemplo utilizaremos o TOP em conjunto com a cláusula ORDER BY para que os resultados retornados possam ser ordenados em ordem ascendente ou descendente, utilizando ASC ou DESC, conforme código abaixo:
SELECT
TOP 3
*
FROM
aluno
ORDER BY
nome ASC
O resultado pode ser visto na Tabela 3.
id | nome | id_turma | |
3 | Bruna dos Santos | bruna@gmail.com | 2 |
1 | João Fernando | joao@gmail.com | 1 |
2 | Maria Carvalho | maria@gmail.com | 1 |
Observe que no resultado da consulta (Tabela 3) utilizando o ORDER BY exibimos o resultado ordenado por nome de forma ascendente (ASC).
Exemplo 2
Para um exemplo um pouco mais complexo, considere o seguinte cenário:
Uma empresa chamada Tem de Tudo possui duas tabelas principais, a tabela produto (Tabela 4), responsável por armazenar todos os produtos da loja, e a tabela venda_produto (Tabela 5), responsável por gerenciar a saída desses produtos.
Id | Nome | preco |
1 | Bola | 35.00 |
2 | Patinete | 120.00 |
3 | Carrinho | 15.00 |
4 | Skate | 296.00 |
5 | Notebook | 3500.00 |
6 | Monitor LG 19 | 450.00 |
7 | O Diário de Anne Frank | 45.00 |
8 | O dia do Curinga | 65.00 |
9 | O mundo de Sofia | 48.00 |
10 | Através do Espelho | 38.00 |
Id | Id_produto | data | valor |
1 | 1 | 2018-07-15 | 35.00 |
2 | 2 | 2018-07-15 | 120.00 |
3 | 2 | 2018-07-14 | 120.00 |
4 | 3 | 2018-07-15 | 15.00 |
5 | 7 | 2018-07-15 | 45.00 |
6 | 8 | 2018-07-15 | 65.00 |
7 | 8 | 2018-07-16 | 65.00 |
8 | 9 | 2018-07-16 | 48.00 |
9 | 5 | 2018-07-16 | 3500.00 |
10 | 5 | 2018-07-16 | 3500.00 |
11 | 6 | 2018-07-16 | 450.00 |
12 | 1 | 2018-07-15 | 35.00 |
13 | 2 | 2018-07-15 | 120.00 |
Suponhamos que a empresa Tem de tudo deseja saber quais os três produtos que tiveram o maior valor de receita. Para isso, podemos utilizar o fragmento de código abaixo:
SELECT TOP 3
P.nome,
SUM(VN.valor) as TOTAL
FROM
produto P, venda_produto VN
WHERE
P.id = VN.id_produto
GROUP BY
P.id
ORDER BY
TOTAL DESC
Observe que no trecho de código acima, na linha 1 pedimos para listar os três primeiros registros. Logo abaixo na linha 3 pedimos para que o valor da coluna valor seja somada. Nas linhas 4 e 5 informamos que a consulta será realizada na tabela produto, nomeada de P, e na tabela venda_produto, nomeada VN.
Em seguida, nas linhas 6 e 7 informamos que a consulta terá como filtro o id da tabela produto ser o mesmo que na tabela venda_produto, realizando o vínculo entre elas.
Nas linhas 8 e 9 agrupamos o resultado por id do produto e, por fim nas linhas 10 e 11 ordenamos essa consulta pelo valor TOTAL, de forma decrescente, ou seja, do maior valor para o menor. O resultado pode ser visto na Tabela 6.
nome | TOTAL |
Notebook | 7000.00 |
Monitor LG 19 | 450.00 |
Patinete | 240.00 |
No exemplo acima utilizamos a função agregadora SUM, a cláusula GROUP BY e ORDER BY.
Saiba mais Veja a Série SQL nível Jedi: Subqueries