Answers:
这两种语法形式有些混乱,因为它们会颠倒数字:
LIMIT <skip>, <count>
等效于:
LIMIT <count> OFFSET <skip>
它与MySQL和PostgreSQL的语法兼容。MySQL支持两种语法形式,其文档声称使用OFFSET的第二种语法旨在提供与PostgreSQL的兼容性。PostgreSQL 文档显示它仅支持第二种语法,而SQLite文档显示它同时支持第二种语法,建议使用第二种语法以避免混淆。
顺便说一句,在没有先使用ORDER BY的情况下使用LIMIT可能不会总给您想要的结果。实际上,SQLite将以某种顺序返回行,这可能取决于它们在文件中的物理存储方式。但这并不一定意味着它符合您想要的顺序。获得可预测订单的唯一方法是显式使用ORDER BY。
LIMIT <count> OFFSET <skip>
更清楚。谢谢。
后者是一种带有以下警告的替代语法:
如果使用逗号而不是OFFSET关键字,则偏移量是第一个数字,限制是第二个数字。这种看似矛盾是故意的-使其与旧版SQL数据库系统的兼容性最大化。
我进行了一些测试,但性能没有差异。
这仅是为了与其他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秒