Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL LIMIT关键字是否有ANSI SQL替代方案?_Mysql_Database_Keyword_Ansi Sql - Fatal编程技术网

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

MYSQL LIMIT关键字是否有ANSI SQL替代方案?,mysql,database,keyword,ansi-sql,Mysql,Database,Keyword,Ansi Sql,MYSQL LIMIT关键字是否有ANSI SQL替代方案 LIMIT关键字限制SELECT返回的行数,例如: SELECT * FROM People WHERE Age > 18 LIMIT 2; 返回2行 SELECT * FROM People WHERE Age > 18 LIMIT 10, 2; 返回前10行之后的2行。我不这么认为。我所知道的所有数据库都使用特定于供应商的关键字来实现该功能 不在SQL:1999中 有两种可能的方法可以在以后的标准中使用,在今天的DB

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

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

SELECT * FROM People WHERE Age > 18 LIMIT 2;
返回2行

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

返回前10行之后的2行。

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

不在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特定的方法。

添加到@jle中:

SQLite支持限制MySQL/PostgreSQL InterBase/Firebird支持先选择,然后像Informix一样跳过
另请参见

HSQL/H2使用类似MySQL的限制

另请参见


让我将一个相关的SO问题与a和另一个问题联系起来:

编辑:还有一些很好的参考链接,在类似情况下值得一看:

; ; 从…起
嗯。。。如果您告诉我们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 form仍然需要遍历所有前面的行,因此它通常不会比其他语法快很多,并且在高限制下仍然会非常慢。可能重复我一直认为Oracle让您以这种方式进行子选择是荒谬的,但是rownum属性是在ORDER BY重新排序之前分配的。“oraclese”有其优缺点吗?我很喜欢Oracle的join速记+外部连接…+1个很好的摘要!SQLite支持LIMIT,比如MySQL/PostgreSQL。InterBase/Firebird支持先选择然后跳过,就像Informix一样。
SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY smell) AS rn,
    FROM things
)
WHERE rn<=n -- or rn BETWEEN m+1 AND m+n
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)