#1. 找出25年前雇的员工select*from emp where add_months(sysdate,-12*25)> hiredate
#2. 截取员工姓名中包含r的后一段字符串(如hrose的rose)select sub(ename,instr(ename,'r'))from emp where instr(ename,'r')<>0#3. 算出部门30中得到奖金最多的员工的姓名
法1:select ename from emp where deptno=30and comm=(selectmax(comm)from emp where deptno=30)
法2:select ename from(select*from emp where deptno=30orderby comm desc)where rownum=1#4. 得到工资大于自己部门平均工资的员工信息select*from emp,(select deptno,avg(sal)as asal from emp groupby deptno) m where emp.deptno=m.deptno and emp.sal > m.asal
#5. 得到每个月工资总数最少的那个部门的部门名称select dname from dept where deptno in(select deptno from(select deptno,sum(sal)as ss from emp groupby deptno orderby ss asc)where rownum=1)#6. 查找出部门10和部门20中,工资最高第三名到工资第五名的员工的员工姓名,部门名称select ename,dname from dept d join(select ename,deptno,rownum asnofrom emp where deptno in(10,20)orderby sal desc) m
on d.deptno = m.deptno and m.no>3and m.no<6#7. 查找出收入(工资+奖金),下级比自己上级还高的员工姓名,员工收入select e1.ename,e1.sal+nvl(e1.comm,0)as sc from emp e1 leftjoin emp e2 on e1.mgr = e2.eno where e1.sal+nvl(e1.comm,0)> nvl(e2.sal,0)+nvl(e1.comm,0)#8. 查找出工资成本最高的部门的部门号和部门名称select*from dept join(select deptno,sum(sal)as ss from emp groupby deptno having ss =(selectmax(sum(sal))from emp groupby deptno)) t on dept.deptno = t.deptno
#9. 各部门各领导底下的员工占员工总人数的比例select deptno,mgr,round(count(eno)/(selectcount(eno)from emp),2)*100||'%'aspercentfrom emp groupby deptno,mgr
-----------------------重要-----------------------------#10. 如果员工表有1000W条数据,请用最高效的的sql实现:
统计各部门:
类1:入职时间>3年,工资大于10000
类2:入职时间>3年,工资小于10000
类3:入职时间<3年,工资大于10000
类4:入职时间<3年,工资小于10000
的人员数量
selectsum(casewhen sal>10000and to_char(sysdate-3,'yyyy')>to_char(hiredate,'yyyy')then1else0end)as'类1',sum(casewhen sal<10000and to_char(sysdate-3,'yyyy')>to_char(hiredate,'yyyy')then1else0end)as'类2',sum(casewhen sal>10000and to_char(sysdate-3,'yyyy')<to_char(hiredate,'yyyy')then1else0end)as'类3',sum(casewhen sal<10000and to_char(sysdate-3,'yyyy')<to_char(hiredate,'yyyy')then1else0end)as'类4'from emp groupby deptno
统计各部门中职位为'manager','developer','operator'的人员工资成本(列名:deptno man dev ope)select
deptno,sum(casewhen job='manager'then sal else0end)as'manager',sum(casewhen job='developer'then sal else0end)as'developer',sum(casewhen job='operator'then sal else0end)as'operator'from emo groupby deptno
#11. 删除人员表中同名人员且只留薪资最高的那一个
法1:
deletefrom emp where eno notin(select e.eno from(select ename,max(sal)as ms from emp groupby ename
)t leftjoin emp e on t.ename=e.ename and t.ms=e.sal
)
法2:
deletefrom emp where eno e1 notin(selectmax(rowid)from emp e2 where e1.ename = e2.ename and e1.sal > e2.sal
)