MYSQL LIMIT关键字是否有ANSI SQL替代方案?
MYSQL LIMIT关键字是否有ANSI SQL替代方案 LIMIT关键字限制SELECT返回的行数,例如: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
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)