Query Sqlite LIMIT / OFFSET

Ho una domanda semplice con Sqlite. Qual è la differenza tra questo:

Select * from Animals LIMIT 100 OFFSET 50 

e

 Select * from Animals LIMIT 100,50 

Le due forms di syntax sono un po ‘confuse perché invertono i numeri:

 LIMIT ,  

È equivalente a:

 LIMIT  OFFSET  

È compatibile con la syntax di MySQL e PostgreSQL. MySQL supporta entrambi i moduli di syntax ei suoi documenti affermano che la seconda syntax con OFFSET era intesa a fornire compatibilità con PostgreSQL. I documenti PostgreSQL mostrano che supporta solo la seconda syntax, e i documenti di SQLite mostrano che supporta entrambi, raccomandando la seconda syntax per evitare confusione.

A proposito, usare LIMIT senza prima usare ORDER BY potrebbe non darti sempre i risultati che intendi. In pratica, SQLite restituirà le righe in un certo ordine, probabilmente determinato dal modo in cui sono fisicamente memorizzate nel file. Ma questo non significa necessariamente che è nell’ordine che vuoi. L’unico modo per ottenere un ordine prevedibile è utilizzare ORDER BY esplicitamente.

Quest’ultima è una syntax alternativa con un avvertimento :

Se viene utilizzata una virgola al posto della parola chiave OFFSET, l’offset è il primo numero e il limite è il secondo numero. Questa apparente contraddizione è intenzionale: massimizza la compatibilità con i sistemi di database SQL legacy.

Ho fatto alcuni test e non ci sono differenze nelle prestazioni.

Questo è solo per compatibilità con altre lingue sql.

Il tempo di esecuzione di entrambe le versioni è lo stesso.

Ho creato sqlite db con table1 con 100000 righe. Corro il prossimo test

 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) + ""); } 

I tempi variano per 0,001 di secondo