在 SQL Server 中,可以使用 TOP 命令返回查询结果中的前 n 行数据。例如,
SELECT TOP 100 * FROM users ORDER BY id可以用来查询注册时间最早的前 100 名用户(这并不一定是最好的方法,只是一个示例)。
我的问题是 - 在其他数据库中,比如 Oracle、MySQL 和 PostgreSQL 等,有没有类似于 TOP 命令的关键字?如果没有类似的关键字,你能推荐哪些解决方法来达到相同的效果呢?
在 SQL Server 中,可以使用 TOP 命令返回查询结果中的前 n 行数据。例如,
SELECT TOP 100 * FROM users ORDER BY id可以用来查询注册时间最早的前 100 名用户(这并不一定是最好的方法,只是一个示例)。
我的问题是 - 在其他数据库中,比如 Oracle、MySQL 和 PostgreSQL 等,有没有类似于 TOP 命令的关键字?如果没有类似的关键字,你能推荐哪些解决方法来达到相同的效果呢?
选择前 100
行:
MySQL
和 PostgreSQL
:
SELECT *
FROM Table
ORDER BY
column
LIMIT 100
Oracle
:
SELECT *
FROM (
SELECT t.*
FROM table
ORDER BY
column
)
WHERE rownum <= 100
请注意,这里需要使用子查询。如果不添加子查询,ROWNUM
会随机选择前10
行,然后按column
排序。
要选择100
到300
之间的行:
MySQL
:
SELECT *
FROM TABLE
ORDER BY
column
LIMIT 100, 200
PostgreSQL
:
SELECT *
FROM Table
ORDER BY
column
OFFSET 100 LIMIT 200
Oracle
:
SELECT *
FROM (
SELECT t.*, ROW_NUMBER() OVER (ORER BY column) AS rn
FROM table
)
WHERE rn >= 100
AND rownum <= 200
请注意,在 Oracle
中,尝试使用 ROWNUM BETWEEN 100 AND 200
(而不是外部查询中的 rn BETWEEN 100 AND 200
)来简化它会返回空值。
RN BETWEEN 100 AND 200
在 Oracle
中也可以工作,但效率较低。
请参阅我的博客文章以获取性能详细信息:
SELECT *
FROM users
ORDER BY id
LIMIT 100;
这是标准的SQL语法(Oracle和SQL Server均可使用)。以下是返回前100行的示例:
SELECT ID_CONTROL FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID_CONTROL)
ROWNUMBER, ID_CONTROL FROM IWS_CONTROL WHERE
CURRENT_STATE = 15 AND CURRENT_STATUS=0) A WHERE ROWNUMBER <= 100)
SELECT TOP 100 * FROM users ORDER BY id
如果您想的话,甚至可以从结果集中间开始:
SELECT TOP 100 START AT 50 * FROM users ORDER BY id
获取结果集中第50行到第150行。
LIMIT 100
就像
SELECT * FROM foo ORDER BY bar LIMIT 100
Oracle:
select * from (select * from foo ORDER BY bar) where rownum < 100
在AskTom里有一个很好的解释如何让它工作。
在Ingres中,相同的查询将是:
select First 100 * from foo ORDER BY bar
Ingres的问题在StackOverflow上已经有答案了。
在Oracle中,您可以使用RANK()和DENSE_RANK()。这里是一个链接到AskTom网站的页面,该页面解释了如何使用DENSE_RANK在Oracle中进行分页和Top-N查询。
在Oracle中,您想要使用TOP-N查询。
例如:
select *
from (SELECT *
FROM foo
where foo_id=[number]
order by foo_id desc)
where rownum <= 3
这将会获取到前三个结果(因为我在子查询中按照降序排序)