开发工具与关键技术:Oracle SQL*plus PL/SQL Developer
撰写时间:2019年03月27日
本次介绍的关键字:Rownum union
Rownum是什么?
Oracle数据库入门之DDL与数据库对象rownum伪列。
伪列,顾名思义就是一个列,不过它不是我们表中的列,而是Oracle数据库给我们提
供使用的列,它可以在我们对于一些用常规方法难以处理,或者难以达到我们需求的时
候提供帮助。例如,在 Oracle 中可以添加 Rownum子句以限制行数,当在 Where 子句
中指定 ROWNUM 时,可生成更简单的语法。
简单的啰嗦几下,现在开始进入了Rownum 伪列的使用,看下它对于我们有什么样的帮
助。下面用例子,以图片加文字的形式展示
查找出全部学生成绩最高分的前3-5名的信息
select *
from (select rownum r,Sname,cno,score
from (select b.Sname,a.cno,a.score
from PW_SC a join pw_student b on a.sno=b.sno order by score desc)
where rownum <=5)
where r >=3
①select b.Sname,a.cno,a.score
from PW_SC a join pw_student b on a.sno=b.sno order by score desc
①首先查出全部的成绩,学生姓名,课程号,以降序排序,注意多表查询的时候需要主
外键相连,避免出现笛卡尔集,这里用的连接方式join…on …
②select rownum r,Sname,cno,score
from (①)
where rownum <=5
②以①为数据源from 查询成绩,学生姓名,课程号,并且插入一个伪列重命名为r,
加上一个where 条件为rownum <=5,伪列是有排序号的,条件的意思就是筛选出小于
伪列数6的,即前5行,这里说一下为什么在②才加入伪列进行以及使用伪列进行筛选
而不再①的时候一步完成,原因:首先我们要明确知道 where条件是必须跟在from后
面,ORDER BY 子句:只能在语句的最后出现,而语句的执行顺序就是先以where
为条件查出数据,ORDER BY 对结果集进行排序,那么我们需要的是先按照成绩进行降
序排序,筛选出最高分的那五条数据,那么最终的结果就是先筛选了成绩无序排放的数
据,再进行排序了,最后的结果就不是我们需要的了,所以不能在①一步到位,为了解
决这个问题,我们就在外面套多一层查询语句,就是②。
③select *
from (②)
where r >=3
③当我们查出了前5条,接下来需要做的就是筛选出第3-5条了,我们再继续在外层
套一层查询语句,以②查询出来的数据为数据源,加上where条件 r >=3查询出大
于等于第3条的数据,最后就得到 3-5的数据了,需要注意的是,最里面①那个查
询选择(select)查询的数据是什么,外层②的查询能查询的就是什么,因为②的数
据来源于①,如果是多层的话,要一层一层的往外层查,不能隔层获取数据。
Oracle的每个函数、关键字都不是只有固定的写法的,人是活的,要想用的好,学
的好,就要把这些死的用到活,只有这样才能做出无限种可能