SQLite LIMIT / OFFSET-Abfrage

153

Ich habe eine einfache Frage mit Sqlite. Was ist der Unterschied zwischen diesen:

Select * from Animals LIMIT 100 OFFSET 50

und

Select * from Animals LIMIT 100,50
Pablo
quelle
9
Bitte markieren Sie es als Antwort, wenn es Ihre Zweifel ausgeräumt hat, wie Sie in den Kommentaren erwähnt haben.
Mubashar

Antworten:

270

Die beiden Syntaxformen sind etwas verwirrend, weil sie die Zahlen umkehren:

LIMIT <skip>, <count>

Ist äquivalent zu:

LIMIT <count> OFFSET <skip>

Es ist kompatibel mit der Syntax von MySQL und PostgreSQL. MySQL unterstützt beide Syntaxformen , und seine Dokumente behaupten, dass die zweite Syntax mit OFFSET die Kompatibilität mit PostgreSQL gewährleisten sollte. PostgreSQL- Dokumente zeigen, dass nur die zweite Syntax unterstützt wird, und SQLites-Dokumente zeigen, dass beide unterstützt werden, und empfehlen die zweite Syntax, um Verwirrung zu vermeiden.

Übrigens: Wenn Sie LIMIT ohne vorherige Verwendung von ORDER BY verwenden, erhalten Sie möglicherweise nicht immer die gewünschten Ergebnisse. In der Praxis gibt SQLite die Zeilen in einer bestimmten Reihenfolge zurück, die wahrscheinlich davon abhängt, wie sie physisch in der Datei gespeichert sind. Dies bedeutet jedoch nicht unbedingt, dass es in der von Ihnen gewünschten Reihenfolge vorliegt. Die einzige Möglichkeit, eine vorhersehbare Reihenfolge zu erhalten, besteht darin, ORDER BY explizit zu verwenden.

Bill Karwin
quelle
2
LIMIT <count> OFFSET <skip>ist klarer. Danke dir.
Guido Mocha
Diese ähnliche Antwort bietet eine gute Lösung mit guter Leistung, wenn die Reihenfolge der Zeilen von Bedeutung ist. stackoverflow.com/a/28860492/5016333
Rodrigo V
23

Letzteres ist eine alternative Syntax mit einer Einschränkung :

Wenn anstelle des OFFSET-Schlüsselworts ein Komma verwendet wird, ist der Offset die erste Zahl und das Limit die zweite Zahl. Dieser scheinbare Widerspruch ist beabsichtigt - er maximiert die Kompatibilität mit älteren SQL-Datenbanksystemen.

Nick Dandoulakis
quelle
5

Ich habe einige Tests durchgeführt und es gibt keinen Unterschied in der Leistung.

Dies dient nur der Kompatibilität mit anderen SQL-Sprachen.

Die Laufzeit beider Versionen ist gleich.

Ich habe sqlite db mit table1 mit 100000 Zeilen erstellt. Ich führe den nächsten Test durch

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

Die Zeiten variieren für 0,001 Sekunden

Kalanj Djordje Djordje
quelle
1
Warum sollte es einen Leistungsunterschied geben? sie sind gleich!
Abhinav Gauniyal