【问题标题】:Sqlite LIMIT / OFFSET querySqlite LIMIT / OFFSET 查询
【发布时间】:2011-03-20 12:35:34
【问题描述】:

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

Select * from Animals LIMIT 100 OFFSET 50

Select * from Animals LIMIT 100,50

【问题讨论】:

  • 如您在cmets中提到的,如果它消除了您的疑虑,请标记为答案。

标签: sqlite limit


【解决方案1】:

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

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 &lt;count&gt; OFFSET &lt;skip&gt; 更清楚。谢谢。
  • 如果行的顺序很重要,这个类似的答案有一个很好的解决方案,性能也很好。 stackoverflow.com/a/28860492/5016333
【解决方案2】:

后者是一种替代语法,有一个警告

如果使用逗号而不是 OFFSET 关键字,那么偏移量就是 第一个数字和限制是 第二个号码。这看似 矛盾是故意的——它 最大限度地与旧版兼容 SQL 数据库系统。

【讨论】:

    【解决方案3】:

    我做了一些测试,性能没有差别。

    这只是为了与其他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 秒

    【讨论】:

    • 为什么会有性能差异?他们是一样的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2021-05-17
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多