SQL 限定返回行数,你想限定查询结果的行数。你不关心排序,任意 n
行都可以。
SQL 限定返回行数 问题
你想限定查询结果的行数。你不关心排序,任意 n
行都可以。
SQL 限定返回行数 解决方案
使用数据库的内置功能来控制返回的行数。
DB2
使用 FETCH FIRST
子句。
使用 LIMIT
子句。
Oracle
对于 Oracle
而言,通过在 WHERE
子句中限制 ROWNUM
的值来获得指定行数的结果集。
SQL Server
使用 TOP
关键字限定返回行数。
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
作为条件(为了返回一行)会成功。