Paginação de resultados com SQL
Como paginar resultados usando bancos de dados MySQL e SQL Server
Um recurso muito comum ao trabalhar com grandes quantidades de registros é fazer a paginação dos resultados. Vamos ver exemplos de como fazer paginação de resultados com SQL utilizando o MySQL e o SQL Server.
Vamos começar pelo MySQL. No MySQL você pode limitar a quantidade de registros da seguinte forma:
SELECT * from minha_tabela LIMIT 10;
A consulta exibida acima retornaria os 10 primeiros registros. Para fazer a paginação, o LIMIT possui outra forma de utilização.
SELECT * from minha_tabela LIMIT posicao_inicial, qtde_registros;
Se por exemplo a tabela tiver 50 linhas e você desejar ver os registros da posição 30 até a 40, a consulta ficaria da seguinte forma:
SELECT * from minha_tabela LIMIT 30, 10;
Outra forma de chegar no mesmo resultado seria fazer o seguinte:
SELECT * FROM minha_tabela LIMIT 10 OFFSET 29
Perceba que o OFFSET recebeu como parâmetro o número da posição anterior que vamos tomar como refêrencia. Como queremos a partir da posição 30, ele recebeu como ponto de partida a posição 29.
No SQL Server os comandos são diferentes. Para listar os 10 primeiros registros, a consulta seria assim:
SELECT TOP 10 * from minha_tabela
Para fazer a paginação, a partir do SQL Server 2005 seria possível fazer utilizando ROW_NUMBER(). Se por exemplo desejamos retornar 10 registros a partir da posição 30, podemos fazer desta forma:
SELECT *
FROM (
SELECT [nome_do_campo], ROW_NUMBER() OVER(ORDER BY [nome_do_campo]) AS Ranking
FROM minha_tabela
) A
WHERE
A.Ranking >= 30
AND A.Ranking < 40
Neste exemplo, criamos um campo chamado Ranking utilizando o ROW_COUNT. Com base nos resultados desta consulta, fizemos um filtro com base no conteúdo deste campo. Uma outra forma de chegar no mesmo resultado é utilizando o operador BETWEEN
SELECT *
FROM (
SELECT [nome_do_campo], ROW_NUMBER() OVER(ORDER BY [nome_do_campo]) AS Ranking
FROM minha_tabela
) A
WHERE
A.Ranking BETWEEN 30 AND 40
A partir do SQL Server 2012, existem dois novos recurso que podem simplificar este trabalho, que são OFFSET e FETCH.
SELECT coluna1, coluna2, coluna3
FROM minha_tabela
ORDER BY coluna1
OFFSET 30 ROWS
FETCH NEXT 10 ROWS ONLY
Neste exemplo, utilizamos o OFFSET para definir a posição inicial, que vai ser a posição 30. O parâmetro FECTH informa que desejamos o retorno de 10 registros, então a consulta vai retornar os registros da posição 30 até a posição 40.