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
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
Antworten:
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.
LIMIT <count> OFFSET <skip>
ist klarer. Danke dir.
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) + "");
}
Die Zeiten variieren für 0,001 Sekunden