Consulta utilizando LIMIT e OFFSET

LIMIT e OFFSET permitem recuperar apenas uma parte das linhas que são gerados pelo resto da consulta.

A sintaxe é a seguinte:

SELECT select_list
    FROM table_expression
    [LIMIT { number | ALL }] [OFFSET number]

Se for especificado um valor de limite, não será retornada mais que esta quantidade de linhas (mas possivelmente menos, se a consulta produzir menos linhas).

Exemplo:

SELECT *
    FROM nome_tabela
    LIMIT 10;

Neste caso, a consulta retornará os 10 primeiros registros ou um valor menor, dependendo do conteúdo da tabela.

LIMIT ALL é o mesmo que omitir a cláusula LIMIT.

OFFSET diz para saltar esta quantidade de linhas antes de começar a retornar as linhas.

Exemplo:

SELECT *
    FROM nome_tabela
    OFFSET 10;

Já neste outro exemplo, a consulta pulará 10 registros e retornará os demais.

OFFSET 0 é o mesmo que omitir a cláusula OFFSET. Se forem especificados tanto OFFSET quanto LIMIT, então são saltadas OFFSET linhas antes de começar a contar as LIMIT linhas que serão retornadas.

Quando se utiliza LIMIT é importante utilizar a cláusula ORDER BY para estabelecer uma ordem única para as linhas do resultado. Caso contrário, será retornado um subconjunto imprevisível de linhas da consulta. Pode-se desejar obter da décima a vigésima linha, mas da décima a vigésima de qual ordem? A ordem é desconhecida a não ser que seja especificado ORDER BY.

O otimizador de consultas leva LIMIT em consideração para gerar o plano da consulta, portanto é bastante provável obter planos diferentes (resultando em uma ordem diferente das linhas) dependendo do que for especificado para LIMIT e OFFSET. Portanto, utilizar valores diferentes de LIMIT/OFFSET para selecionar subconjuntos diferentes do resultado da consulta produz resultados inconsistentes, a não ser que seja imposta uma ordem previsível do resultado por meio da cláusula ORDER BY. Isto não está errado, isto é uma consequência inerente ao fato do SQL não prometer retornar os resultados de uma consulta em qualquer ordem específica, a não ser que ORDER BY seja utilizado para impor esta ordem.

É necessário computar as linhas saltadas pelo OFFSET no servidor, portanto, um OFFSET grande pode ser ineficiente.

Comentários