ROWNUM在达梦数据库中的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ROWNUM在达梦数据库中的使用
ROWNUM 是一个虚假的列,表示从表中查询的行号,或者连接查询的结果集行数。它将被分配为1,2,3,4,..N,N 是行的数量。通过使用ROWNUM ,我们可以限制查询返回的行数。
我们以实例库BOOKSHOP中RESOURCES模式下EMPLOYEE表为例
该表的完整数据如下:
如果我们只想看到前5 行数据,可以这样写
SELECT * FROM RESOURCES.EMPLOYEE WHERE rownum < 6;
需要注意的是,一个ROWNUM 值不是被永久的分配给一行。表中的某一行并没有标号,不可以查询ROWNUM 值为5 的行。ROWNUM 值只有当被分配之后才会增长,并且初始值为1。即只有满足一行后,ROWNUM 值才会加1,否则只会维持原值不变。因此,以下语句在任何时候都不能返回数据。
SELECT * FROM RESOURCES.EMPLOYEE WHERE ROWNUM > 6; SELECT * FROM RESOURCES.EMPLOYEE WHERE ROWNUM = 6;
ROWNUM 一个重要作用是控制返回结果集的规模,可以避免查询在磁盘中排序。因为,ROWNUM 值的分配是在查询的谓词解析之后,任何排序和聚合之前进行的。因此,在排序和聚合使用ROWNUM 时需要注意,可能得到并非预期的结果,例如假如我们想得到员工年龄最大的五个人
SELECT * FROM RESOURCES.EMPLOYEE WHERE ROWNUM < 6 ORDER BY BIRTHDATE;
以上语句只会对EMPLOYEE 表前5 行数据按BIRTHDATE排序输出,并不是表的所有数据按BIRTHDATE 排序后输出前5行,要实现后者,需要使用如下语句:
SELECT * FROM (SELECT * FROM RESOURCES.EMPLOYEE ORDER BY BIRTHDATE) WHERE ROWNUM < 6;或者
SELECT TOP 5 * FROM RESOURCES.EMPLOYEE ORDER BY BIRTHDATE; 结果如下:
关于ROWNUM的使用,还需注意以下的限制:
1.在查询中,ROWNUM 可与任何数字类型表达式进行比较及运算,但不能出现在含OR 的布尔表达式中,否则报错处理;
2.ROWNUM 只能在非相关子查询中出现,不能在相关子查询中使用,否则报错处理;
3.在非相关子查询中,ROWNUM 只能实现与TOP 相同的功能,因此子查询不能含ORDER BY 和GROUP BY;
4.ROWNUM 所处的子谓词只能为如下形式:ROWNUM op exp,exp 的类型只能是立即数、参数和变量值,op ∈{<, <=, >, >=, =, <>}。