MySQL练习题
1,取得每个部门最高薪水的人员名称:
1,先按照部门分组并求出每个部门的最大值,以及获取最大值的部门编号。作为临时表
2,通过join on 连接两个表,使用子表中的部门编号和最高薪资找到每个部门最高薪水员工的名称。
select e.ename, t.* from (select deptno, max(sal) as maxsal from emp group by deptno) t join emp e on t.deptno = e.deptno and t.maxsal = e.sal;
总结与反思:当仅仅执行 select ename, max(sal) from emp group by deptno;仅仅是返回每个部门的最大值,且与name并无关联。
关键结论:但凡使用分组函数(count, max, min, avg, sum)时,仅仅是得到对应的值,且不会和行中的数据进行关联。因此需要限定条件对其进行重新匹配。
另外需要注意到,使用分组函数会自动过滤数据表中的null。
2,那些人的薪水在部门的平均薪水之上。
select e.ename, e.sal from(select deptno, avg(sal) as avgsal from emp group by deptno) t join emp e on t.deptno = e.deptno and e.sal >= t.avgsal;
总结与反思:与上题的思路一致,主要考察的是分组函数的使用。
3,部门中(所有人的)平均薪资等级。
select e.deptno,avg(s.grade) as newgrade from emp e,salgrade s where e.sal between s.losal and hisal group by deptno;
总结和反思:分组函数和group by的联用,by后的字段内容,和分组函数的结果是对应的。
4,不使用max分组函数找出工资中的最大值。
方法1,使用max分组函数,得出分组函数中的最大值。
方法2,使用limit,使得工资降序排列得出最大值。
方法3,使用表的自连接方法,如下语句所示
select sal from emp where sal not in (select distinct a.sal from emp a join emp b on a.sal < b.sal);s使用两张变进行自连接,先通过a.sal<b.sal得出所有小于最大值的值,然后使用not in函数和where就能得出最大值。。。
5,取得平均薪水最高的部门的部门编号
先求出最高的平均工资,在根据having进行条件过滤,可求得所求值。
或者可以直接根据group by方法,再根据order by方法,使用降序的方法,最后使用limit方法,可以直接取得所求值。
select deptno, avg(sal) as avgsal from emp group by deptno having avgsal = (select max(t.avgsal) from (select avg(sal) as avgsal from emp group by deptno) t );