SQL 限定返回行数

SQL 限定返回行数,你想限定查询结果的行数。你不关心排序,任意 n 行都可以。

SQL 限定返回行数 问题

你想限定查询结果的行数。你不关心排序,任意 n 行都可以。

SQL 限定返回行数 解决方案

使用数据库的内置功能来控制返回的行数。

DB2

使用 FETCH FIRST 子句。

select *
  from emp fetch first 5 rows only

MySQLPostgreSQL

使用 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 FIRSTLIMIT 这样的子句来指定查询结果的行数。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 作为条件(为了返回一行)会成功。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程