伪列:rownum 他是Oracle数据库内置列,任何表都可以使用,他作用是显示表中数字的行号
select * from emp;
select emp.*,rownum from emp;
select t.*,rownum r from(select * from emp order by sal)t;
--查询工资最低的5名员工信息
select t.*,rownum r from (select * from emp order by sal)t where rownum<=5;
--注意如果给伪劣加条件,小于一个值是可以,不能让他大于某个值,也不能直接等于一个不等于1的值,但可以直接等于1
select t.*,rownum r from(select * from emp order by sal)t where rownum>=2;
--伪列不能直接大于一个值
select t.*,rownum r from (select * from emp order by sal) t where rownum=5;
--伪列不能直接等于一个不等于1的值
select t.*,rownum r from (select * from emp order by sal) t where rownum=1;
--伪列可以直接等于1
使用rownum的分页sql,rownum伪列的序号,只连续的不考虑值相等的情况(值相同序号不相同)
row_number():需要和over分析函数联用,排序的序号和rownum伪列相同,连续序号,不考虑值相等的情况(值相同序号不相同)比如值为aabfdgg 序号为1234567
select * ,row_number()over;
dense_rank():可以用来做排序,它序号连续,考虑重复数据,如果值相等序号就相同
rank():可以用来做排序,它序号不连续,考虑重复数据,如果值相等序号相同
比如值为aabbcchjk 序号为112233456
over(partition by 分组列 order by 排序列):over子句中的分组partition by和group by的分组不同,它不会把数据聚合成一条,在over子名中可以省略
select e.*,row_number()over(order by sal desc) r from emp e;
select e.*,dense_rank()over(order by sal desc) r from emp e;
select e.*,rank()over(order by sal desc) r from emp e;
select e.*,row_number()over(partition by deptno order by sal desc) r from emp e;
select e.*,dense_rank()over(partition by deptno order by sal desc) r from emp e;
select e.*,rank()over(partition by deptno order by sal desc) r from emp e;
使用row_number(),rank(),dense_rank()的分页sql,只需要一层子查询
select * from (select e.*,row_number()over(order by sal) r from emp e) t where t.r between 5 and 10;