SQLite LIMIT / OFFSET查询


153

我对Sqlite有一个简单的问题。这有什么区别:

Select * from Animals LIMIT 100 OFFSET 50

Select * from Animals LIMIT 100,50

9
如果它消除了您在评论中提到的疑虑,请将其标记为答案。
Mubashar

Answers:


270

这两种语法形式有些混乱,因为它们会颠倒数字:

LIMIT <skip>, <count>

等效于:

LIMIT <count> OFFSET <skip>

它与MySQL和PostgreSQL的语法兼容。MySQL支持两种语法形式,其文档声称使用OFFSET的第二种语法旨在提供与PostgreSQL的兼容性。PostgreSQL 文档显示它仅支持第二种语法,而SQLite文档显示它同时支持第二种语法,建议使用第二种语法以避免混淆。

顺便说一句,在没有先使用ORDER BY的情况下使用LIMIT可能不会总给您想要的结果。实际上,SQLite将以某种顺序返回行,这可能取决于它们在文件中的物理存储方式。但这并不一定意味着它符合您想要的顺序。获得可预测订单的唯一方法是显式使用ORDER BY。


2
LIMIT <count> OFFSET <skip>更清楚。谢谢。
Guido Mocha

如果行的顺序很重要,那么类似的答案将是一个具有良好性能的良好解决方案。stackoverflow.com/a/28860492/5016333
Rodrigo V

23

后者是一种带有以下警告的替代语法:

如果使用逗号而不是OFFSET关键字,则偏移量是第一个数字,限制是第二个数字。这种看似矛盾是故意的-使其与旧版SQL数据库系统的兼容性最大化。


5

我进行了一些测试,但性能没有差异。

这仅是为了与其他sql语言兼容。

两个版本的运行时间相同。

我用100000行的table1制作了sqlite db。我进行下一个测试

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秒


1
为什么性能会有所不同?他们是一样的!
Abhinav Gauniyal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.