Olá!
Quando realizamos a execução de uma instrução Select no banco de dados (BD), é possível que não seja retornado nenhum registro, como também pode ser retornado um ou vários registros.
Imagine que seja realizado uma consulta no DB e retorne 100 registros, entretanto o programa que realiza a execução desta consulta só necessita dos 5 primeiros registros retornados. Assim, está sendo desperdiçado processamento, pois 100 registros estão sendo selecionados, mas somente 5 registros é que estão sendo utilizados.
Então, como elaborar uma instrução SQL que selecione apenas os 5 primeiros registros?
Para definir a quantidade de registros que serão retornados de uma consulta no DB, usamos o comando:
Banco de dados | Comando |
DB2 | FETCH FIRST número ROWS ONLY |
SQL Server | TOP número |
MySQL | LIMIT número |
Oracle | ROWNUM <= número |
- número é um valor numérico inteiro.
Para os exemplos dos comandos acima, considerar a tabela PESSOA logo abaixo, está tabela possui 7 registros cadastrados, e também campo CD_PESSOA como chave primaria (PK).
PESSOA | |||
CD_PESSOA | NOME | SOBRENOME | IDADE |
1 | Felipe | Barbosa | 23 |
2 | Ana | Vieira | 20 |
3 | João | Santos | 19 |
4 | Aline | Silva | 21 |
5 | Maira | Dantas | 25 |
6 | Ana | Havana | 19 |
7 | Aline | Ferreira | 22 |
Instrução Select que realiza a seleção dos 5 primeiros nomes da tabela PESSOA, segue os exemplos de cada banco de dados:
1) - DB2
SELECT NOME
FROM PESSOA
WHERE CD_PESSOA > 0
ORDER BY CD_PESSOA
FETCH FIRST 5 ROWS ONLY
2)- SQL Server
SELECT TOP 5 NOME
FROM PESSOA
WHERE CD_PESSOA > 0
ORDER BY CD_PESSOA
SELECT NOME
FROM PESSOA
WHERE CD_PESSOA > 0
ORDER BY CD_PESSOA
LIMIT 5
SELECT * FROM (
SELECT NOME
FROM PESSOA
WHERE CD_PESSOA > 0
ORDER BY CD_PESSOA
) WHERE ROWNUM = 5A execução de cada um dos exemplos, irá retornar:
Registro | NOME |
1 | Felipe |
2 | Ana |
3 | João |
4 | Aline |
5 | Maira |
Note que no Oracle ocorre a necessidade de um Select encadeado, pois no Oracle primeiro é executado o ROWNUM e depois o ORDER BY, e assim não retornando o resultado esperado, porque deste modo seria selecionado os 5 registros da tabela e depois ordenados. Então, para que primeiro seja executado o ORDER BY toda tabela, é necessário executar ele em um único Select, e depois executar o ROWNUM nos dados já ordenados. Para mais informações sobre ROWNUM com ORDER BY veja aqui.
Enfim, nos exemplos apresentados está sendo retornado apenas os 5 primeiros registros cadastrados na tabela PESSOA. E retornar os 5 últimos registros desta tabela? É somente acrescentar o DESC na cláusula do ORDER BY, assim a ordenação seria feita do último registro para o primeiro, ou seja, de forma descendente.
Felipe Barbosa Ferreira
Até o próximo post!