思考题

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” 博客,转载请与作者联系!

你可能感兴趣的:(复杂查询)