SQL练习题二

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;

SQL练习题二_第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(+);

第一步查询结果如图所示:
SQL练习题二_第2张图片
第二步查询结果如图所示:SQL练习题二_第3张图片
第三步查询结果如图所示:
SQL练习题二_第4张图片

	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

第一步:
SQL练习题二_第5张图片
第二步:SQL练习题二_第6张图片

5、列出部门名称和这些部门的员工信息(人数、平均工资),同时列出那些没有员工的部门

mysql>select d.dname, e.ename,e.job from emp e right join dept d on e.deptno=d.deptno

SQL练习题二_第7张图片

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;

SQL练习题二_第8张图片

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;

SQL练习题二_第9张图片

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';

SQL练习题二_第10张图片

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;

SQL练习题二_第11张图片

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;

SQL练习题二_第12张图片

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;

SQL练习题二_第13张图片

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;

SQL练习题二_第14张图片

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;

SQL练习题二_第15张图片

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;

SQL练习题二_第16张图片

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;

SQL练习题二_第17张图片

18、列出所有员工的年工资,所在部门名称,按年薪从低到高排序

mysql>select e.ename,sal*12 income,d.dname
      from emp e,dept d
      where e.deptno=d.deptno
      order by income;

SQL练习题二_第18张图片

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

你可能感兴趣的:(mysql,sql,数据库,mysql)