MySql基础34题写题记录(21-29)
21、列出在部门"SALES"工作的员工的姓名,假定不知道销售部的部门编号
先找到销售部的部门编号
Select deptno
From dept
Where dname = ‘sales’
再找部门员工
Select ename
From emp
Where deptno = (Select deptno
From dept
Where dname = ‘sales’);
22、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级
这里注意在找员工和领导的时候要用外联,因为king没有领导,如果不用外联的话,会少人
先找到平均工资
Select avg(sal)
From emp
再找剩下的信息
Select a.ename,c.dname,b.ename,a.sal
From emp a
Left Join emp b
On a.mgr = b.empno
Join dept c
On a.deptno = c.deptno
Where a.sal > (Select avg(sal)
From emp);
23、列出与"SCOTT"从事相同工作的所有员工及部门名称
问题出现在没有吧scott本人排除掉
先找scott从事的工作
Select e.job myjob
From emp e
Where e.ename = ‘scott’
再找和scott从事相同的工作的员工和部门名称
Select e.ename,d.dname
From emp e
Join dept d
On e.deptno = d.deptno
Where e.job =( Select e.job myjob
From emp e
Where e.ename = ‘scott’) and ename <> 'SCOTT' ;
24、列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金
这题感觉好怪,没管了
25、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金.部门名 称
找部门30里面的最高工资
Select max(sal) max_sal
From emp
Where deptno = 30
找高于部门30最高工资的其他员工信息
Select e.ename,e.sal,d.dname
From emp e
Join dept d
On e.deptno = d.deptno
Where e.sal > (Select max(sal) max_sal
From emp
Where deptno = 30);
26、列出在每个部门工作的员工数量,平均工资和平均服务期限
问题:这里题目要求的部门是要显示部门名称,要考虑到为null的情况,在这里应该不会导致错误,因为会被忽略,只是不太好看
计算时间是计算的两个年差,在mysql中,用到了timestampdiff函数,语法TimeStampDiff(间隔类型, 前一个日期, 后一个日期)
Select count(e.ename),ifnull(avg(e.sal),0),ifnull(avg(timestampdiff(year,e.hiredate,now())),0),d.dname
From emp e
Right join dept d
On e.deptno = d.deptno
Group by d.deptno;
27、列出所有员工的姓名、部门名称和工资
Select e.ename,d.dname,e.sal
From emp e
Join dept d
On e.deptno = d.deptno
28、列出所有部门的详细信息和人数
Select count(e.ename),d.*
From emp e
Right Join dept d
On e.deptno = d.deptno
Group by e.deptno;
29、列出各种工作的最低工资及从事此工作的雇员姓名
问题,采用了左联,意思是左边的所有都要显示,但是结果明显是不能显示所有,因此出结果的时候,出现了14行结果
另外一个问题是,连接时,只要求两个表的工作相同,并没有要求工资相同,这就不能把最低工资的人找出来,只能把这个工作的人找出来
先求最低工资
Select min(sal) min_sal,job
From emp e
Group by job;
再求雇员名字
Select e.ename,d.min_sal,d.job
From emp e
join (Select min(sal) min_sal,job
From emp e
Group by job) d
On e.job = d.job and e.sal = d.min_sal;
最近课真的太多太多了,已经好久没更新了,以后尽量一天一更!