rownum伪行号-排行榜-分页
?rownum伪行号-排行榜-分页 1.rownum 是oracle数据库特有的一个特性,它针对每一个查询(包括子查询),都会生成一个rownum用于对该次查询进行编号 2.每个rownum只针对当前select 查询有效,可以使用别名进行显示 例子:select rownum,emp.* from emp; --表名指定列(* 前面一定要别名指定列,或者表名指定列) 例子:查询出工资最高的前五名 --6个字句的执行先后 :from,where,group by,having,select,select --先排序,后筛选 (错误)select rownum,emp.* from emp where rownum<=5 order by sal desc; --先筛选后排序 select * from (select * from emp order by sal desc) where rownum<=5; --要先排序,后筛选 ? 排行榜 --查询出工资水平在前5名的员工姓名,和工资 --理解:先排序,在通过rownum查询出前5条,在查看工资是否存在在这前5条里面 --本例包含三个查询,共有三个rownum select ename,sal from emp where sal in(select * from ( select sal from emp order by sal desc) where rownum<=5) and rownum<=5; ? 例子: --查询出工资最低的前五名 --注意:查询排行榜时,可能遇到边界问题 select rownum,emp.* from emp where rownum<=5 order by sal; --查询出工资最低的前五名 的姓名和工资 select ename,sal from emp where sal in (select * from (select sal from emp order by sal asc ) where rownum <=5) and rownum <=5; ? 分页查询 --两种分页方法:rownum 和rownumde 别名 注意:rownum 不支持 > 和 >= 判断;rownum的别名支持>和>=判断 ? 方法一 例子: 分页查询员工姓名,工资,入职日期;每页显示5条 分别查询出第1,2,3页数据 方法一: 理解:先在子查询中查询出前N页,在二次主查询查询出第N页;需要在子查询rownum别名 --首先用子查询查询出1*5 1-5页,再用主查询查询出大于(1-1)*5 >0 1-2-3-4-5 就是第1页 --首先用子查询查询出2*5 1-10页,再用主查询查询出大于(2-1)*5 >5 6-7-8-9-10就是第2页 --首先用子查询查询出3*5 1-15页,再用主查询查询出大于(3-1)*5 >5 11-12-13-14-15就是第3页 select * from (select rownum rn,emp.* from emp where rownum <=1*5) where rn >(1-1)*5 select * from (select rownum rn,emp.* from emp where rownum <=2*5) where rn >(2-1)*5 select * from (select rownum rn,emp.* from emp where rownum <=3*5) where rn >(3-1)*5 ? 方法二: --先在子查询中查询出所有的数据和数据的rownum,并使用别名表示,在第二次主查询中通过别名进行分页控制 理解:--首先用子查询查询出所有数据 ,在用主查询控制分页:(3-1)*5<=rn<=3*5 第3页 --首先用子查询查询出所有数据 ,在用主查询控制分页:(2-1)*5<=rn<=2*5 第2页 --首先用子查询查询出所有数据 ,在用主查询控制分页:(1-1)*5<=rn<=1*5 第1页 select * from (select rownum rn,emp.* from emp ) where rn<=3*5 and rn>=(3-1)*5; select * from (select rownum rn,emp.* from emp ) where rn<=2*5 and rn>=(2-1)*5; select * from (select rownum rn,emp.* from emp) where rn<=1*5 and rn>=(1-1)*5; 方法一的效率更高 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |