SQL 限定返回行数,你想限定查询结果的行数。你不关心排序,任意 n
行都可以。
SQL 限定返回行数 问题
你想限定查询结果的行数。你不关心排序,任意 n
行都可以。
SQL 限定返回行数 解决方案
使用数据库的内置功能来控制返回的行数。
DB2
使用 FETCH FIRST
子句。
select *
from emp fetch first 5 rows only
使用 LIMIT
子句。
select *
from emp limit 5
Oracle
对于 Oracle
而言,通过在 WHERE
子句中限制 ROWNUM
的值来获得指定行数的结果集。
select *
from emp
where rownum <= 5
SQL Server
使用 TOP
关键字限定返回行数。
select top 5 *
from emp
SQL 限定返回行数 扩展知识
许多数据库提供了类似 FETCH FIRST
和 LIMIT
这样的子句来指定查询结果的行数。Oracle 与此不同,你必须使用 ROWNUM
的函数,该函数会为结果集里的每一行指定一个行号(从 1 开始,逐渐增大)。
当你使用 ROWNUM<=5
限定只返回最初的 5
行数据时,会发生如下的事情。
- Oracle 执行查询。
- Oracle 取得第一行数据,并把它的行号定为 1。
- 已经超过第 5 行了吗?如果没有,Oracle 会返回当前行,因为当前的行号满足小于或等于 5 这一条件。如果已经超过,那么 Oracle 就不返回当前行。
- Oracle 取得下一行数据,并且将行号加 1(得到 2,然后得到 3,再然后得到 4,以此类推)。
- 返回第 3 步。
如上述处理过程所示,Oracle 会在取得某一行数据之后再为其编号,这是关键之处。很多 Oracle 开发人员试图只获取一行数据,比如指定 ROWNUM=5
,希望只返回第 5 行。但是,同时使用 ROWNUM
和等式条件是不对的。以下是使用 ROWNUM=5
后实际发生的事情。
- Oracle 执行查询。
- Oracle 取得第一行数据,并把它的行号定为 1。
- 已经到第 5 行了吗?如果没有,那么 Oracle 会舍弃这一行,因为它不符合条件。如果是,那么 Oracle 会返回当前行。但是,行号永远不可能到 5 !
- Oracle 取得下一行数据,并把它的行号定为 1。这是因为查询结果的第 1 行的行号必须是 1。
- 返回第 3 步。
深入理解这一过程,你会明白为什么通过指定等式条件 ROWNUM=5
来获取第 5
行会失败。如果你不先获取第 1
行到第 4
行,第 5
行从何而来?
你可能会注意到,ROWNUM=1
确实能得到第 1
行,这似乎与上述解释相矛盾。ROWNUM=1
运行正常的原因在于,Oracle 必须至少尝试一次读取,才能确定表里是否有记录。仔细阅读以上处理过程,用 1
替换 5
,你就会理解为什么指定 ROWNUM=1
作为条件(为了返回一行)会成功。