Sqlite LIMIT / OFFSET 查询

166

我有一个简单的问题关于SQLite。以下两者有何不同:

Select * from Animals LIMIT 100 OFFSET 50

Select * from Animals LIMIT 100,50
3个回答

301
两种语法形式有点令人困惑,因为它们颠倒了数字的顺序:
LIMIT <skip>, <count>

等价于:

LIMIT <count> OFFSET <skip>

它与MySQL和PostgreSQL的语法兼容。MySQL支持这两种语法形式,其文档声称第二种带OFFSET的语法是为了与PostgreSQL兼容。PostgreSQL 文档只支持第二种语法,而SQLite的文档则显示它支持两种语法,并建议使用第二种语法以避免混淆。

顺便说一句,在没有使用ORDER BY的情况下使用LIMIT可能不会始终给您想要的结果。实际上,SQLite会按某种顺序返回行,可能由它们在文件中的物理存储方式决定。但这并不一定意味着它是您想要的顺序。获取可预测的顺序的唯一方法是明确使用ORDER BY。


这个类似的答案提供了一个很好的解决方案,如果行的顺序很重要,那么性能也很好。https://dev59.com/d2Yr5IYBdhLWcg3wAFvE#28860492 - Rodrigo V

24

后者是一种替代语法,但有一个注意点

如果使用逗号代替OFFSET关键字,则第一个数字是偏移量,第二个数字是限制数量。这看似矛盾是有意为之的-它最大化了与传统SQL数据库系统的兼容性。


5
我进行了一些测试,性能没有区别。这只是为了与其他SQL语言兼容。 两个版本的运行时间是相同的。 我使用100,000行创建了一个名为table1的sqlite数据库,并进行了下一次测试。
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) + "");
}

时间变化为0.001秒


3
为什么性能会有差异?它们是相同的! - Abhinav Gauniyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接