1、列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资
思路:
确定需要的数据表:
emp表:可以查询出员工的数量
dept表:部门名称
emp表:统计信息
确定已知的关联字段:
emp.deptno=dept.deptno
做法:
第一步:找出至少有一个员工的部门编号
mysql>select deptno,count(empno)
from emp
group by deptno
having count(empno)>0;
第二步: 找到部门名称,因为数据量小,所以可以将之前的emp表和dept表两个进行连接,统一采用多字段分组的方式进行查询
mysql>select d.deptno,d.dname,count(e.empno)
from emp e,dept d
where e.deptno=d.deptno(+)
group by d.deptno,d.dname
having count(e.empno)>0;
第三步:继续统计
mysql>select d.deptno,d.dname,count(e.empno),avg(sal),min(sal),max(sal)
from emp e,dept d
where d.deptno=e.deptno(+)
group by d.deptno,d.dname
having count(e.empno)>1;
2、列出薪金比SMITH或者ALLEN多的所有员工的编号、姓名、部门名称、其领导姓名
思路:
确定需要的数据表:
emp表:查询出SMITH或ALLEN的工资
emp表:最终的显示需要编号、姓名
emp表:领导的姓名,自身关联
dept表:部门名称
确定已知的关联字段:
雇员和领导:emp.mgr=m.emp.empno;
雇员和部门:emp.deptno=dept.deptno;
做法:
第一步:找出SMITH和ALLEN的工资
select sal from emp where ename in ('SMITH','ALLEN');
第二步:以上的查询返回的结果是多行单列,按照子查询的要求在WHERE子句中写合适,所以将上面的查询作为一个子查询出现,继续查询符合此要求的员工的编号、姓名
mysql>select e.empno,e.ename
from emp e
where e.sal>any (
select sal
from emp
where ename in ('SMITH','ALLEN'));
第三步:查询出部门的名称,引入部门表,同时增加消除笛卡儿积的条件
mysql>select e.empno,e.ename,d.dname
from emp e,dept d
where e.sal>any(
select sal
from emp
where ename in ('SMITH','ALLEN'))
and e.deptno=d.deptno;
第四步:领导的信息需要emp表自身关联
mysql>select e.empno,e.ename,d.dname,m.ename
from emp e,dept d,emp m
where e.sal>any(
select sal
from emp
where ename in ('SMITH','ALLEN'))
and e.deptno=d.deptno
and e.mgr=m.empno(+);
第一步查询结果如图所示:
第二步查询结果如图所示:
第三步查询结果如图所示:
3、列出所有员工的编号、姓名及其直接上级的编号、姓名,显示的结果按领导年工资的降序排列思路:
确定需要的数据表:
emp表:员工的编号、姓名
emp表:领导的编号、姓名、计算年薪
确定已知的关联字段:
emp.mgr=m.emp.empno;
做法:
第一步:查询员工的编号、姓名和领导的编号、姓名;
mysql>select e.empno,e.ename,m.empno,m.ename
from emp e,emp m
where e.mgr=m.empno(+);
第二步:增加计算领导年工资按降序排列;
mysql>select e.empno,e.ename,m.empno,m.ename,(m.sal+nvl(m.comm,0))*12 income
from emp e,emp m
where e.mgr=m.empno(+)
order by income desc;
4、列出雇佣日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数
第一步:列出所有受雇日期早于其直接上级的所有员工的编号,姓名
mysql> select a.empno,a.ename,a.hiredate,b.empno,b.ename,b.hiredate from emp a join emp b
on a.mgr=b.empno where a.hiredate select a.empno,a.ename,d.dname from emp a join emp b on a.mgr=b.empno join dept d o
n a.deptno=d.deptno where a.hiredate
5、列出部门名称和这些部门的员工信息(人数、平均工资),同时列出那些没有员工的部门
mysql>select d.dname, e.ename,e.job from emp e right join dept d on e.deptno=d.deptno
6、列出所有CLERK的姓名及其部门名称,部门的人数,工资等级
mysql> select e.name,d.dname,count(empno),s.grade from emp e,dept d,salgrade s
where e.deptno=d.deptno and e.job = 'CLERK'and
(e.sal between s.losal and s.hisal)
group by e.ename,d.dname,s.grade;
7、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数及所在部门名称、位置、平均工资
mysql> select e.job,count(e.empno),d.dname,d.loc,avg(e.sal) from emp e,dept d
-> where e.deptno=d.deptno
-> and e.sal>1500
-> group by e.job,d.dname,d.loc;
8、列出在部门SALES工作的员工的姓名、基本工资、雇佣日期、部门名称,假定不知道该部门的部门编号
mysql> select e.ename,e.sal,e.hiredate,d.dname
from emp e,dept d
where e.deptno=d.deptno
and d.dname='SALES';
9、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级
mysql> select e.ename,d.dname,m.ename,s.grade from emp e,dept d,emp m,salgrade s
-> where e.deptno = d.deptno and e.mgr = m.empno
-> and e.sal > (select avg(sum(sal)) from emp group by sal)
-> and e.sal between s.losal and s.hisal;
10、列出与SCOTT从事相同工作的所有员工及部门名称,部门人数
mysql> select e.name,d.dname,count(e.empno) from emp e,dept d
-> where e.deptno=d.deptno and
-> e.job=(select job from emp where ename='SCOTT')
-> group by e.ename,d.dname;
11、列出公司各个工资等级雇员的人数、平均工资
mysql>select s.grade,count(e.empno),avg(e.sal)
from emp e,salgrade s
where e.sal between s.losal and s.hisal
group by s.grade,s.losal,s.hisal
order by s.grade;
12、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称
mysql>select e.empno,e.ename,e.sal,d.dname
from emp e,dept d
where sal>all(
select sal from emp where deptno=30)
and e.deptno=d.deptno;
13、列出在每个部门工作的员工数量、平均工资和平均服务期限
mysql>select d.deptno,d.dname,count(e.empno),avg(e.sal),
avg(months_between(sysdate,hiredate)/12) year
from emp e,dept d
where e.deptno(+)=d.deptno
group by d.deptno,d.dname;
14、列出所有员工的姓名、部门名称和工资
mysql>select e.ename,d.dname,e.sal
from emp e,dept d
where e.deptno=d.deptno;
15、列出所有部门的详细信息和部门人数
mysql>select d.deptno,d.dname,d.loc,count(e.empno)
from emp e,dept d
where e.deptno(+)=d.deptno
group by d.deptno,d.dname,d.loc;
16、列出各种工作的最低工资及从事此工作的雇员姓名
mysql>select e.ename,e.job,e.sal
from emp e,(
select job,min(sal) min
from emp
group by job) temp
where e.job=temp.job
and e.sal=temp.min;
17、列出各个部门的MANAGER的最低薪金、姓名、部门名称、部门人数
mysql>select e.ename,e.sal,d.dname,res.count
from emp e,(
select deptno dno,min(sal) sal
from emp
where job='MANAGER'
group by deptno) temp,dept d,(
select deptno dno,count(empno) count
from emp
group by deptno) res
where e.deptno=temp.dno
and e.sal=temp.sal
and e.job='MANAGER'
and e.deptno=d.deptno
and res.dno=d.deptno;
18、列出所有员工的年工资,所在部门名称,按年薪从低到高排序
mysql>select e.ename,sal*12 income,d.dname
from emp e,dept d
where e.deptno=d.deptno
order by income;
19、列出某个员工的上级主管及所在部门名称,并列出这些主管中的薪水超过3000的
mysql>select distinct m.ename,d.dname,m.sal
from emp e,emp m,dept d
where e.mgr=m.empno
and m.deptno=d.deptno
and m.sal>3000;
20、求出部门名称中带‘S’字符的部门员工的工资合计、部门人数
mysql>select d.dname,sum(e.sal),count(e.empno)
from emp e,dept d
where e.deptno(+)=d.deptno
and d.dname like '%S%'
group by d.dname;
21、给任职日期超过30年或者87年雇佣的雇员加薪,加薪原则:10部门增长10%,20部门增长20%,30部门增长30%,以此类推
UPDATE EMP SET
SAL=(1+DEPTNO/100)*SAL
WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)/12>30
OR TO_CHAR(HIREDATE,'yyyy')=1987