伪列:rownum 它是oracle数据库内置列,任何表都可以使用,它作用是显示表中数字的行号
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;
–注意如果给伪列加条件,小于一个值是可以,不能让它大于某个值
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伪列的序号,只连续的不考虑值相等的情况(值相同序号不相同)
–查询5到10名的员工信息
select * from (select t.*,rownum r from (select * from emp order by sal) t) t2 where t2.r between 5 and 10;
–包三层查询
- row_number():
需要和over分析函数联用,排序的序号和rownum伪列相同,连续序号,不考虑值相等的情况(值相同序号不相同)
select *,row_number()over
- dense_rank():
可以用来做排序,它序号连续,考虑重复数据,如果值相等序号就相同
- rank():
可以用来做排序,它序号不连续,考虑重复数据,如果值相等序号相同
- 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;
笔记:
**rownum:**显示表中的数字行号
注:给伪列加条件,小于可以,大于不可以,不能直接等于一个不等于1的值
是对结果的序号,只连续,不考虑值相等的情况
**rowid:**数据物理地址,可以作为数据唯一标识(用来去重)
**row_number()*需要与over联用 ,不考虑值相等
**dense_rank()*可以用来排序,考虑重复数据、值相等序号相等
**rank():**可以用来排序,序号不连续,考虑重复数据
over(partition by 分组列 order by 排序列):(开窗函数):与 group by 不同,不会将数据整合为一条,在over子句中可省略。
语法:
case
when 条件表达式1 then
值
when 条件表达式2 then
值
when 条件表达式3 then
值
…
else
默认值
end
语义:如果表达式成立,那么整个语句值为表达式,then后面的值,
如果所有表达式都不成立,会取else后的默认值
else语句可以省略
select * from student;
select count(*) from student where ssex=‘男’;
select s.,
(select count() from student where ssex=‘男’) 男生人数,
(select count(*) from student where ssex=‘女’) 女生人数
from student s;
使用case when统计男生人数
select
sum(case when ssex=‘男’ then 1 else 0 end) 男生人数,
sum(case when ssex=‘男’ then 0 else 1 end) 女生人数
from student s;



