Risposte:
Le due forme di sintassi sono un po 'confuse perché invertono i numeri:
LIMIT <skip>, <count>
È equivalente a:
LIMIT <count> OFFSET <skip>
È compatibile con la sintassi di MySQL e PostgreSQL. MySQL supporta entrambi i moduli di sintassi e i suoi documenti affermano che la seconda sintassi con OFFSET doveva fornire compatibilità con PostgreSQL. I documenti PostgreSQL mostrano che supporta solo la seconda sintassi e i documenti di SQLite mostrano che supporta entrambi, raccomandando la seconda sintassi per evitare confusione.
A proposito, l'utilizzo di LIMIT senza prima utilizzare ORDER BY potrebbe non dare sempre i risultati desiderati. In pratica, SQLite restituirà le righe in un certo ordine, probabilmente determinato da come sono fisicamente archiviate nel file. Ma questo non significa necessariamente che sia nell'ordine desiderato. L'unico modo per ottenere un ordine prevedibile è utilizzare ORDER BY in modo esplicito.
LIMIT <count> OFFSET <skip>
è più chiaro. Grazie.
Quest'ultima è una sintassi 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 c'è differenza 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. Eseguo 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