【问题标题】:Is there an ANSI SQL alternative to the MYSQL LIMIT keyword?MYSQL LIMIT 关键字是否有 ANSI SQL 替代品?
【发布时间】:2010-10-10 08:32:15
【问题描述】:

是否有 ANSI SQL 替代 MYSQL LIMIT 关键字?

LIMIT 关键字限制 SELECT 返回的行数,例如:

SELECT * FROM People WHERE Age > 18 LIMIT 2;

返回 2 行。

SELECT * FROM People WHERE Age > 18 LIMIT 10, 2;

在前 10 行之后返回 2 行。

【问题讨论】:

  • 嗯...如果您告诉我们 MySql LIMIT 关键字的作用,我们这些了解 Ansi SQL 的人可能会为您提供帮助...
  • James, SELECT * FROM table LIMIT x 返回前 x 个结果,SELECT * FROM table LIMIT x, y 返回偏移量为 x 的 y 个结果。
  • LIMIT [x, ]y 也适用于 Postgres。
  • 值得指出的是 LIMIT x, y 形式仍然需要遍历所有较早的行,因此它通常不会比其他语法快多少(并且对于高限制仍然可能非常慢)。

标签: mysql database keyword ansi-sql


【解决方案1】:

我不这么认为。我知道的所有数据库都使用特定于供应商的关键字来实现该功能。

【讨论】:

    【解决方案2】:

    this shows the different ways:

    -- DB2
    select * from table fetch first 10 rows only 
    -- Informix 
    select first 10 * from table 
    -- Microsoft SQL Server and Access 
    select top 10 * from table 
    -- MySQL and PostgreSQL 
    select * from table limit 10 
    -- Oracle 
    select * from (select * from table) where rownum <= 10
    

    【讨论】:

    • 我一直认为 Oracle 让您以这种方式进行子选择是荒谬的,但是 rownum 属性是在使用 ORDER BY 重新排序之前分配的。
    • 'oraclese' 有其优点和缺点,嗯?我确实喜欢 Oracle 的外连接简写 (+)...
    • +1 不错的总结! SQLite 支持 LIMIT,如 MySQL/PostgreSQL。 InterBase/Firebird 支持 SELECT FIRST 和 SKIP,如 Informix。
    【解决方案3】:

    不在 SQL:1999 中。

    您可以在以后的标准中使用两种可能的方法,但在当今的 DBMS 中支持水平普遍较低。

    在 SQL:2008 中,您可以使用 DB/2 语法:

    SELECT * FROM things
    ORDER BY smell
    FETCH FIRST n ROWS ONLY
    

    这仅适用于“LIMIT n”,不适用于扩展的“LIMIT m, n”偏移语法。在 SQL:2003 中可以使用窗口函数,它可以支持扩展语法,但是是一个超级 PITA:

    SELECT * FROM (
        SELECT *, ROW_NUMBER() OVER (ORDER BY smell) AS rn,
        FROM things
    )
    WHERE rn<=n -- or rn BETWEEN m+1 AND m+n
    

    您现在将更经常使用特定于 DBMS 的方法。

    【讨论】:

      【解决方案4】:

      添加到@jle 的answer

      • SQLite 支持LIMIT (MySQL/PostgreSQL)
      • InterBase/Firebird 支持 SELECT FIRSTSKIP(如 Informix)

      另见Emulate MySQL LIMIT clause in Microsoft SQL Server 2000

      【讨论】:

        【解决方案5】:

        HSQL/H2 像 MySQL 一样使用 LIMIT

        【讨论】:

          【解决方案6】:

          另见http://en.wikipedia.org/wiki/Select_(SQL)#FETCH_FIRST_clause

          SELECT * FROM T LIMIT 10 OFFSET 20 -- Netezza, MySQL, PostgreSQL (also supports the standard, since version 8.4), SQLite, HSQLDB, H2
          
          SELECT * from T WHERE ROWNUM <= 10 -- Oracle (also supports the standard, since Oracle8i)
          
          SELECT FIRST 10 * from T -- Ingres
          
          SELECT FIRST 10 * FROM T order by a -- Informix
          
          SELECT SKIP 20 FIRST 10 * FROM T order by c, d -- Informix (row numbers are filtered after order by is evaluated. SKIP clause was introduced in a v10.00.xC4 fixpack)
          
          SELECT TOP 10 * FROM T -- MS SQL Server, Sybase ASE, MS Access
          
          SELECT TOP 10 START AT 20 * FROM T -- Sybase SQL Anywhere (also supports the standard, since version 9.0.1)
          
          SELECT FIRST 10 SKIP 20 * FROM T -- Interbase, Firebird
          
          SELECT * FROM T ROWS 20 TO 30 -- Firebird (since version 2.1)
          
          SELECT * FROM T
          WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY -- DB2
          
          SELECT * FROM T
          WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY -- DB2 (new rows are filtered after comparing with key column of table T)
          

          【讨论】:

            【解决方案7】:
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-09-26
            • 2017-04-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-28
            • 1970-01-01
            相关资源
            最近更新 更多