Query LIMIT / OFFSET Sqlite


153

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

Select * from Animals LIMIT 100 OFFSET 50

e

Select * from Animals LIMIT 100,50

9
Contrassegnalo come risposta se ha chiarito i tuoi dubbi come indicato nei commenti.
Mubashar,

Risposte:


270

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.


2
LIMIT <count> OFFSET <skip>è più chiaro. Grazie.
Guido Mocha,

Questa risposta simile ha una buona soluzione con buone prestazioni se l'ordine delle righe è importante. stackoverflow.com/a/28860492/5016333
Rodrigo V

23

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.


5

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


1
perché dovrebbe esserci qualche differenza nelle prestazioni? sono uguali!
Abhinav Gauniyal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.