【发布时间】:2011-03-20 12:35:34
【问题描述】:
我对 Sqlite 有一个简单的问题。这有什么区别:
Select * from Animals LIMIT 100 OFFSET 50
和
Select * from Animals LIMIT 100,50
【问题讨论】:
-
如您在cmets中提到的,如果它消除了您的疑虑,请标记为答案。
我对 Sqlite 有一个简单的问题。这有什么区别:
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 表明它同时支持这两种语法,推荐第二种语法以避免混淆。
顺便说一下,使用 LIMIT 而不首先使用 ORDER BY 可能并不总是会给您想要的结果。实际上,SQLite 会以某种顺序返回行,这可能取决于它们在文件中的物理存储方式。但这并不一定意味着它是您想要的顺序。获得可预测顺序的唯一方法是显式使用 ORDER BY。
【讨论】:
LIMIT <count> OFFSET <skip> 更清楚。谢谢。
后者是一种替代语法,有一个警告:
如果使用逗号而不是 OFFSET 关键字,那么偏移量就是 第一个数字和限制是 第二个号码。这看似 矛盾是故意的——它 最大限度地与旧版兼容 SQL 数据库系统。
【讨论】:
我做了一些测试,性能没有差别。
这只是为了与其他sql语言兼容。
两个版本的运行时间相同。
我用 table1 制作了 100000 行的 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 秒
【讨论】: