甲骨文认证体系
Vmware认证体系
AWS亚马逊
阿里云认证体系
红帽认证体系
ZStack云计算认证体系
思科认证体系
华为认证体系
CDA数据分析师认证
达梦认证体系
麒麟
定制化课程
达梦数据库培训干货分享ROWNUM在达梦数据库中的使用
发布日期:2020-09-08 10:33:02阅读次数:

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 < 6ORDER 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 ∈ {<, <=, >, >=, =,<>}。


上海腾科教育科技有限公司聚焦ICT人才培养和教育服务、培养数字化时代的新型ICT人才、促进良性的ICT人才生态发展,提供面授教育、在线教育、IT人才培养与就业、高校专业共建与实验室建设、企业人才定制培养,以及教育科技领域内的技术开发、咨询、服务以及解决方案,专注高校ICT课程课件研发、基于华为公有云的云实验实训平台建设,致力于ICT技术在高等院校的引进、开发和推广,是一家全国性的专业ICT行业技术认证服务公司。

腾科教育是华为授权的培训合作伙伴,专业提供华为ICT技术架构认证、平台与服务认证、行业服务认证等华为职业认证服务,连续多年荣获华为年度最佳合作伙伴贡献奖、华为优秀战略合作伙伴、上海HCIE精英俱乐部伙伴,连续多年举办腾科技术嘉年华华为专场,并协办华为ICT大赛、华为生态伙伴精英赛伙伴赛分赛场、华为人才双选会上海场等活动和赛事,提供面向华为生态合作伙伴和ICT学员的人才供需双选平台及ICT学员就业通道,培养ICT行业所需创新型、融合型人才。