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.
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.
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)+"");}
Antworten:
Die beiden Syntaxformen sind etwas verwirrend, weil sie die Zahlen umkehren:
Ist äquivalent zu:
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.
quelle
LIMIT <count> OFFSET <skip>
ist klarer. Danke dir.Letzteres ist eine alternative Syntax mit einer Einschränkung :
quelle
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
Die Zeiten variieren für 0,001 Sekunden
quelle