A cláusula TOP da linguagem SQL é utilizada para limitar o número de registros retornados por uma consulta e é pode, por exemplo, garantir certo ganho de desempenho em algumas consultas que normalmente seriam compostas por uma quantidade muito grande de registros.
São muitos os usos possíveis dessa instrução, então vou citar apenas uma, a que utilizarei para os exemplos desse artigo.
Suponha que em uma tabela do banco de dados sejam armazenados os dados dos jogadores de um determinado jogo, tais como código, nome e pontuação. Em determinado momento, deseja-se obter um ranking com os três primeiros ou melhores jogadores, tomando como critério a pontuação. Para isso, é possível utilizar a cláusula TOP, como veremos a seguir.
Neste artigo, explicarei como utilizar o TOP em diferentes SGBD’s: SQL Server, MySQL, PostgreSQL, Oracle e Firebird. Então, inicialmente precisamos conhecer a sintaxe básica desse comando.
SELECT TOP [NUMERO DE REGISTROS] [COLUNA(S)] FROM [TABELA]
SELECT [COLUNA(S)] FROM [TABELA] LIMIT [NUMERO DE REGISTROS]
SELECT [COLUNA(S)] FROM [TABELA] WHERE ROWNUM < [NUMERO DE REGISTROS]
SELECT FIRST [NUMERO DE REGISTROS] [COLUNA(S)] FROM [TABELA]
O parâmetro [NUMERO DE REGISTROS] indica a quantidade de linhas que a consulta deve retornar. No caso do ranking dos três primeiros jogadores, esse valor seria 3. A partir desse ponto, a consulta mantém sua sintaxe padrão.
Vejamos na prática essa consulta funcionando. No caso, estarei utilizando apenas o SQL Server para apresentar os resultados da utilização desta cláusula. Inicialmente inseri alguns dados fictícios na tabela, como se pode ver na figura a seguir.
Para ilustrar o exemplo do ranking, selecionarei os três jogadores mais bem colocados e, em seguida, os três últimos colocados.
SELECT TOP 3 * FROM JOGADORES ORDER BY PONTOS DESC
O resultado é exibido na Figura 2 a seguir.
Vejamos agora os três últimos colocados.
SELECT TOP 3 * FROM JOGADORES ORDER BY PONTOS
A seguir, veremos as instruções equivalentes nos demais SGBD’s citados.
SELECT * FROM JOGADORES ORDER BY PONTOS DESC LIMIT 3
SELECT * FROM JOGADORES ORDER BY PONTOS DESC WHERE ROWNUM < 3
SELECT FIRST 3 * FROM JOGADORES ORDER BY PONTOS DESC
SELECT * FROM JOGADORES ORDER BY PONTOS LIMIT 3
SELECT * FROM JOGADORES ORDER BY PONTOS WHERE ROWNUM < 3
SELECT FIRST 3 * FROM JOGADORES ORDER BY PONTOS
Complementando a Listagem 12, poderíamos querer ordenar a listagem dos três últimos em ordem crescente, para isso bastaria fazer como mostra o código a seguir.
SELECT * FROM
(SELECT FIRST 3 * FROM JOGADORES ORDER BY PONTOS DESC)
ORDER BY PONTOS
Ou seja, foi feita uma consulta externa à principal para reordenar o resultado original.
Conclusão
O uso da cláusula TOP (como é mais conhecida) pode garantir ganho de performance para a aplicação e é, na maioria das vezes, mais viável que fazer essa limitação de registros por código, seja qual for a linguagem utilizada.
Espero que este breve artigo possa ajudar àqueles que utilizam esses SGBD's.
Um abraço e até a próxima.