我对Sqlite有个简单的问题。是什么这之间的区别:Sqlite LIMIT/OFFSET查询
Select * from Animals LIMIT 100 OFFSET 50
和
Select * from Animals LIMIT 100,50
我对Sqlite有个简单的问题。是什么这之间的区别:Sqlite LIMIT/OFFSET查询
Select * from Animals LIMIT 100 OFFSET 50
和
Select * from Animals LIMIT 100,50
两个语法形式是有点混乱,因为他们扭转号:
LIMIT <skip>, <count>
等同于:
LIMIT <count> OFFSET <skip>
它与MySQL和PostgreSQL的语法兼容。 MySQL支持两种语法形式,并且它的docs声称带OFFSET的第二种语法是为了提供与PostgreSQL的兼容性。 PostgreSQL docs表明它只支持第二种语法,并且SQLite's docs表明它支持这两种语法,推荐第二种语法以避免混淆。
顺便说一句,在没有首先使用ORDER BY的情况下使用LIMIT可能并不总是给你你想要的结果。在实践中,SQLite将按照某种顺序返回行,这可能取决于它们物理存储在文件中的方式。但这并不一定意味着它是按照你想要的顺序。获得可预测顺序的唯一方法是明确使用ORDER BY。
嘿!非常感谢你!您已清除我的疑问 – Pablo 2010-07-24 15:40:19
'LIMIT
如果行的顺序很重要,这个类似的答案有很好的解决方案和良好的性能。 http://stackoverflow.com/a/28860492/5016333 – 2016-03-19 00:30:00
后者是一种替代的语法与一个警告:
如果使用逗号代替 OFFSET关键字,则该偏移量是 第一个数字和所述限制是 第二数量。这种看似 的矛盾是故意的 - 它 最大化与传统 SQL数据库系统的兼容性。
非常感谢你! – Pablo 2010-07-24 15:41:46
我做了一些测试,性能没有差异。
这只是为了与其他sql语言兼容。
两个版本的运行时间相同。
我做了sqlite数据库与table1 100000行。我跑下一个测试
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) + "");
}
时报的第二
为什么会有性能差异?他们是一样的! – 2017-06-26 04:37:20
0.001有所不同,请把它标记为答案,如果你在评论中提到已清除你的疑虑。 – 2015-02-16 11:55:53