1.求每个部门最高薪水的人员名称
解决思路:1 先求每个部门最高的薪水
SELECT e.deptno,MAX(e.sal) as maxsal from emp e GROUP BY e.deptno;
2. 将第一步得出来的结果,当成临时表
SELECT e.deptno,ename,t.maxsal,e.sal from (SELECT e.deptno,max(e.sal) as maxsal from emp e GROUP BY e.deptno) t JOIN emp e on t.deptno = e.deptno WHERE t.maxsal = e.sal ORDER BY --做一个排序 e.deptno;
- 哪些人的薪水在部门平均薪水之上
SELECT e.deptno,avg(e.sal) as avgsal from emp e GROUP BY e.deptno;
2. 查看哪些人的薪水大于平均水平
SELECT e.deptno,e.ename,e.sal from (SELECT e.deptno,avg(e.sal) as avgsal from emp e GROUP BY e.deptno) t JOIN emp e ON e.deptno = t.deptno WHERE t.avgsal < e.sal
3.取得部门中(所有人的)平均薪水等级
SELECT e.deptno,avg(e.sal) as avgsal from emp e GROUP BY e.deptno;
SELECT t.deptno,t.avgsal,s.grade from ( SELECT e.deptno,avg(e.sal) as avgsal from emp e GROUP BY e.deptno) t JOIN salgrade s on t.avgsal BETWEEN s.losal and hisal
- 取得部门中所有人的平均的薪水等级
SELECT e.deptno,e.ename,s.grade FROM emp e join salgrade s on e.sal BETWEEN s.losal and s.hisal;
2. 在临时表求平均的
SELECT t.deptno,t.ename,AVG(t.grade) as avggrade FROM (SELECT e.deptno,e.ename,s.grade FROM emp e join salgrade s on e.sal BETWEEN s.losal and s.hisal) t GROUP BY t.deptno
- 不用组函数(MAX),求取最高薪水(俩种方案)
SELECT e.sal from emp e ORDER BY e.sal desc LIMIT 1
SELECT a.sal FROM emp a WHERE a.sal not in (SELECT a.sal from emp a join emp b on a.sal < b.sal);
- 求取平均薪水最高的部门的部门编号
SELECT e.deptno,avg(e.sal) as avgsal FROM emp e GROUP BY e.deptno
2. 求出平均水平最大值,再进行筛选
SELECT t.deptno FROM ( SELECT e.deptno,avg(e.sal) as avgsal FROM emp e GROUP BY e.deptno)t HAVING MAX(avgsal)
7 . 求取平均薪水最高部门的部门名称
SELECT d.dname FROM ( SELECT e.deptno,avg(e.sal) as avgsal FROM emp e GROUP BY e.deptno)t JOIN dept d ON t.deptno = d.deptno HAVING MAX(avgsal)
8.求平均薪水的等级最低的部门名称
SELECT e.deptno,avg(e.sal) AS avgsal FROM emp e group by e.deptno
SELECT MIN(s.grade) from (SELECT e.deptno,avg(e.sal) AS avgsal FROM emp e group by e.deptno) t join salgrade s on t.avgsal between s.losal and s.hisal
3.连表就行求部门名称
SELECT t.deptno,t.dname,s.grade FROM (SELECT e.deptno,d.dname,avg(e.sal) as avgsal FROM emp e JOIN dept d on e.deptno = d.deptno GROUP BY e.deptno,d.dname)t JOIN salgrade s on t.avgsal BETWEEN s.losal and s.hisal WHERE s.grade = (SELECT MIN(s.grade) from (SELECT e.deptno,avg(e.sal) AS avgsal FROM emp e group by e.deptno) t join salgrade s on t.avgsal between s.losal and s.hisal )
- 求比普通员工的最高薪水高的经理名字
SELECT DISTINCT --去重 mgr FROM emp
SELECT max(sal) as maxsal FROM emp WHERE empno not in (SELECT DISTINCT mgr FROM emp WHERE mgr is not null)
注 in 会自动忽略空值,not in不会自动忽略
SELECT ename from emp WHERE sal > (SELECT max(sal) as maxsal FROM emp WHERE empno not in (SELECT DISTINCT mgr FROM emp WHERE mgr is not null) )
10 取薪水最高的前五名员工
SELECT * from emp ORDER BY sal desc LIMIT 0,5;
11 取得薪水最高的第六到第十名员工
SELECT * from emp ORDER BY sal desc limit 5,5
12 取得最后入职的5名员工
SELECT * from emp order by hiredate desc limit 0,5
13求每个等级有多少员工
1.查询每个员工的薪水等级
SELECT e.ename,s.grade FROM emp e JOIN salgrade s on e.sal BETWEEN s.losal and s.hisal ORDER BY s.grade
SELECT t.grade ,COUNT(t.ename) as countEmp FROM (SELECT e.ename,s.grade FROM emp e JOIN salgrade s on e.sal BETWEEN s.losal and s.hisal ORDER BY s.grade) t GROUP BY t.grade