4.6. LIMIT e OFFSET

LIMIT e OFFSET permitem trazer apenas uma parte das linhas geradas pela consulta:

SELECT lista_seleção
    FROM expressão_tabela
    [LIMIT { número | ALL }] [OFFSET número]

Se o limite for fornecido, não mais que esta quantidade de linhas será retornada (mas possivelmente menos, se a consulta produzir menos linhas). LIMIT ALL é o mesmo que omitir a cláusula LIMIT.

OFFSET informa para saltar esta quantidade de linhas antes de começar a retornar as linhas para o cliente. OFFSET 0 é o mesmo que omitir a cláusula OFFSET. Se tanto OFFSET quando LIMIT forem especificados, então são saltadas OFFSET linhas antes de começar a contar as LIMIT linhas que serão retornadas.

Quando se utiliza LIMIT é uma boa idéia utilizar também a cláusula ORDER BY, estabelecendo uma ordem única para as linhas do resultado. Senão, será retornado um subconjunto imprevisível de linhas da consulta --- pode ser desejado obter da décima a vigésima linha, mas da décima a vigésima de qual ordem? A ordenação é desconhecida a não ser que ORDER BY seja especificado.

O otimizador de consultas leva em consideração o LIMIT 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. Sendo assim, utilizar valores diferentes de LIMIT/OFFSET para selecionar subconjuntos diferentes do resultado de uma consulta produz resultados inconsistentes, a não ser que seja estabelecida uma ordem determinada por meio da cláusula ORDER BY. Isto não está errado; isto é uma conseqüência direta do fato do SQL não prometer retornar os resultados de uma consulta em nenhuma ordem específica, a não ser que ORDER BY seja utilizado para especificar esta ordem.