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 email 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
Tabela 1. Estrutura da tabela aluno

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 email 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
Tabela 2. Resultado da consulta utilizando a cláusula TOP 3

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 email 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
Tabela 3. Resultado da consulta utilizando ORDER BY nome

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
Tabela 4. Tabela produto

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
Tabela 5. Tabela venda_produto

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
Tabela 6. Resultado da consulta pelos 3 produtos com maior rendimento

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