O TOP é uma cláusula SQL que especifica o número de linhas que devem ser retornadas no resultado de uma consulta.
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 | 360.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