1.列出至少有一个员工的所有部门。
如果要统计出员工的数量,那么一定要按照dept字段分组,那么现在分组之后的数据要执行过滤,一定要使用having子句。
select count(empno) count from emp group by deptno having count(empno)>1;
2.列出工资比“SMITH”多的所有员工。
第一步:找到SMITH的工资
select sal from emp where ename = 'SMITH';
第二步:单行单列子查询
select * from emp where sal >(select sal from emp where ename='SMITH');
3.列出受雇日期早于其上级的所有员工的编号,姓名,部门名称。
select e.empno,e.ename,m.ename,d.dname
from emp e,emp m,dept d
where e.mgr = m.empno(+) and e.hiredate <m.hiredate and e.deptno=d.deptno;
4.列出所有部门名称和这些部门的员工信息(人数、平均工资、平均服务年限、最高和最低工资),同时列出那些没有员工的部门。
select d.dname,d.loc,temp.count,temp.avg,temp.avgyear,temp.max,temp.min
from dept d,(select e.deptno dno,count(e.empno) count,avg(e.sal) avg ,avg(months_between(sysdate,hiredate)/12) avgyear,max(sal) max ,min(sal) min
from emp e
group by e.deptno) temp
where d.deptno=temp.dno(+);
5.列出所有”CLERK(办事员)“的姓名及其部门名称,部门人数。
select e.ename,d.dname ,temp.count
from emp e,dept d,(
select deptno dno,count(empno) count
from emp
group by deptno) temp
where e.job='CLERK'
and e.deptno = d.deptno
and d.deptno = temp.dno;
6.列出最低薪金大于1500的各种工作及其从事此工作的全部雇员人数。
select e.job ,count(empno)
from emp e
group by e.job
having min(e.sal)>1500;
7.列出在部门”SALES“(销售部)工作的员工的姓名、工资。
select e.ename,e.sal
from emp e
where e.deptno =(select d.deptno
from dept d
where d.dname='SALES');
8.列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级与具备此工资等级人数
第一步:找到公司的平均薪金
select avg(sal+nvl(comm,0)) from emp;
第二步:找到薪金高于公司平均薪金的员工信息
select e.empno,e.ename,e.job,e.sal,e.comm
from emp e
where (e.sal+nvl(e.comm,0))>(
select avg(sal+nvl(comm,0)) from emp
);
第三步:找到所在部门的信息
select e.empno,e.ename,e.job,e.sal,e.comm,d.dname,d.loc
from emp e,dept d
where (e.sal+nvl(e.comm,0))>(
select avg(sal+nvl(comm,0)) from emp
)
and e.deptno = d.deptno(+);
第四步:找到领导数据
select e.empno,e.ename,e.job,e.sal,e.comm,d.dname,d.loc ,m.ename
from emp e,dept d,emp m
where (e.sal+nvl(e.comm,0))>(
select avg(sal+nvl(comm,0)) from emp
)
and e.deptno = d.deptno
and e.mgr = m.empno(+);
第五步:工资等级
select e.empno,e.ename,e.job,e.sal,e.comm,d.dname,d.loc ,m.ename,s.grade
from emp e,dept d,emp m,salgrade s
where (e.sal+nvl(e.comm,0))>(
select avg(sal+nvl(comm,0)) from emp
)
and e.deptno = d.deptno
and e.mgr = m.empno(+)
and e.sal between s.losal and s.hisal;
第六步:统计指定工资等级的人数
select e.empno,e.ename,e.job,e.sal,e.comm,d.dname,d.loc ,m.ename,s.grade,temp.count
from emp e,dept d,emp m,salgrade s,(
select st.grade sg,count(et.empno) count
from emp et,salgrade st
where et.sal between st.losal and st.hisal
group by st.grade
) temp
where (e.sal+nvl(e.comm,0))>(
select avg(sal+nvl(comm,0)) from emp
)
and e.deptno = d.deptno
and e.mgr = m.empno(+)
and e.sal between s.losal and s.hisal
and s.grade = temp.sg;
9.列出与”SCOTT“从事相同工作的所有员工及部门名称。
第一步:找到职位
select job from emp where ename ='SCOTT';
第二步:筛选员工数据和部门名称
select e.*,d.*
from emp e,dept d
where e.deptno = d.deptno
and e.job=(select job from emp where ename ='SCOTT');
10.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金、部门名称。
第一步:找到30部门的薪金
select sal from emp where deptno = 30;
第二步:之前的查询返回多行单列
select e.ename,e.sal
from emp e
where e.sal in(
select sal from emp where deptno = 30
) and e.deptno !=30;
第三步:加入部门名称
select e.ename,e.sal,d.dname
from emp e,dept d
where e.sal in(
select sal from emp where deptno = 30
and e.deptno !=30
and e.deptno =d.deptno;
11.列出各种工作的最低工资及从事此工作的雇员姓名。
第一步:按照职位分组,而后统计出职位名称,最低工资
select job,min(sal) min
from emp
group by job;
第二步:将以上的查询作为临时表
select e.*
from emp e,(
select job,min(sal) min
from emp
group by job) temp
where e.job=temp.job and
e.sal =temp.min;
12.列出各个部门的CLERK的最低薪金
select e.deptno,min(sal)
from emp e
where e.job ='CLERK'
group by e.deptno;
13.求出部门名称中,带'S'字符的部门员工的工资合计、部门人数。
第一步:找到所有带S的部门编号
select deptno from dept where dname like '%S%';
第二步:找到指定部门的员工
select e.ename,e.sal
from emp e
where e.deptno in(select deptno from dept where dname like '%S%');
第三步:统计部门信息
select e.ename,e.sal,temp.sum,temp.count
from emp e,(
select deptno dno,sum(sal) sum,count(empno) count
from emp
group by deptno
)temp
where e.deptno in(select deptno from dept where dname like '%S%')
and e.deptno = temp.dno ;
本文出自 “10281302” 博客,转载请与作者联系!