分页查询 |
rownum:是数据库中提供的一个伪劣,作用是给记录分配行号。
思想:先给记录分配行号,再根据我们要查找的范围进行检索,确定行号的范围。
练习1:查询员工信息,同时分配行号
select e.*,rownum from emp e;
练习2:查询前5条员工的信息
select e.*,rownum from emp e where rownum<6;
练习3:查询员工表中的第6条到第10条
select * from (select e.*,rownum ro from emp e) where ro between 6 and 10;
练习4:查询第5页每页记录数为3
select * from (select e.*,rownum ro from emp e) where ro between 13 and 15;
decode函数 |
格式:decode(colName,search1,result1,[search2,result2].......,default);
逻辑:检索colName的值,如果是search1,那就使用result1
如果是search2,那就使用result2
如果是search3,那就使用result3
......
否则使用default
没有default,返回的是null。
练习1:年终发奖金,职位是'MANAGE R'发放月薪的1.2倍,'SALESMAN',发放月薪的1.1倍,'CLERK'发放月薪的1.05倍,其他月薪作为奖金,查询每个人年终奖以及姓名和职位
select ename,job,decode(job,'MANAGER',1.2,'SALESMAN',1.1,'CLERK',1.05,1)*sal from emp ;
注意:Mysql中没有decode函数这个用法。
case when |
与decode函数功能相同。
格式:case colName when search1 then result1
when search2 then result2
......
else reulst0 end
同上个练习:
select ename,job,case job when 'MANAGER' then 1.2*sal when 'SALESMAN' then 1.1*sal when 'CLERK' then 1.05*sal else sal end from emp;
decode函数与group by连用:
练习1:职位'MANAGER' 和'SALESMAN' 属于vip,职位'CLERK'属于svip,其他的属于ip,查询三种级别的人数
select le,count(*) from (select decode(job,'MANAGER','vip','SALESMAN','vip','CLERK','svip','ip') le from emp)t group by le order by count(*);
练习2:排序规则,accounting排第一,sales排第二位,research排第三位,operations排第四位
select dname,le from (select dname,decode(dname,'ACCOUNTING',1,'SALES',2,'RESEARCH',3,'OPERATIONS',4)le from dept)t order by le desc;
排序函数 |
写在select子句中
1-->row_number() over(partition by colName1 order by colName2) 连续不重复
2-->rank() over(partition by colName1 order by colName2) 不连续重复
3-->dense_rank() over(partititon by colName1 order by colName2) 重复连续
练习1:查询所有员工信息,按照月薪排序
select e.*,dense_rank() over ( order by sal desc) from emp e;
练习2:区间查询练习
select * from (select e.*,dense_rank() over ( order by sal desc) rn from emp e) where rn>1 and rn<5;