Consulta Sqlite LIMIT / OFFSET

153

Eu tenho uma pergunta simples com o SQLite. Qual é a diferença entre isso:

Select * from Animals LIMIT 100 OFFSET 50

e

Select * from Animals LIMIT 100,50
Pablo
fonte
9
Por favor, marque-o como resposta se tiver esclarecido suas dúvidas, como você mencionou nos comentários.
Mubashar 16/02

Respostas:

270

As duas formas de sintaxe são um pouco confusas porque invertem os números:

LIMIT <skip>, <count>

É equivalente a:

LIMIT <count> OFFSET <skip>

É compatível com a sintaxe do MySQL e PostgreSQL. O MySQL suporta ambas as formas de sintaxe, e seus documentos afirmam que a segunda sintaxe com OFFSET foi criada para fornecer compatibilidade com o PostgreSQL. Os documentos do PostgreSQL mostram que ele suporta apenas a segunda sintaxe, e os documentos do SQLite mostram que ele suporta os dois, recomendando a segunda sintaxe para evitar confusão.

A propósito, usar LIMIT sem primeiro usar ORDER BY nem sempre pode fornecer os resultados que você pretende. Na prática, o SQLite retornará as linhas em alguma ordem, provavelmente determinada pela forma como elas estão fisicamente armazenadas no arquivo. Mas isso não significa necessariamente que está na ordem que você deseja. A única maneira de obter um pedido previsível é usar ORDER BY explicitamente.

Bill Karwin
fonte
2
LIMIT <count> OFFSET <skip>é mais claro. Obrigado.
Guido Mocha
Essa resposta semelhante tem uma boa solução com bom desempenho se a ordem das linhas for importante. stackoverflow.com/a/28860492/5016333
Rodrigo V /
23

A última é uma sintaxe alternativa com uma ressalva :

Se uma vírgula for usada em vez da palavra-chave OFFSET, o deslocamento será o primeiro número e o limite será o segundo número. Essa aparente contradição é intencional - maximiza a compatibilidade com os sistemas de banco de dados SQL herdados.

Nick Dandoulakis
fonte
5

Fiz alguns testes e não há diferença no desempenho.

Isso é apenas para compatibilidade com outras linguagens sql.

O tempo de execução das duas versões é o mesmo.

Criei sqlite db com table1 com 100000 linhas. Eu corro próximo teste

long timeLimitOffset = 0;
long timeLimitComma = 0;
for (int i = 0; i < 100000; i++)
{
   //first version
   timeLimitOffset += SqlDuraction("Select * from table1  order by col1 LIMIT " + (i + 1) + " OFFSET " + (1001 - i) + "");
   // second version
   timeLimitComma += SqlDuraction("Select * from table1 order by col1 LIMIT " + (1001 - i) + " , " + (i + 1) + "");
}

Os tempos variam de 0,001 segundo

Kalanj Djordje Djordje
fonte
1
por que haveria alguma diferença no desempenho? eles são iguais!
Abhinav Gauniyal