部门表、员工表、薪水等级表
1.取得每个部门最高薪水人员名称
第一步:取得每个部门最高薪水作为临时表t
select deptno,max(sal) as maxSal from emp group by deptno第二步:临时表t与emp表连接条件 e.deptno=t.deptno and e.sal=t.maxSal
select e.ename,t.* from emp e join (select deptno,max(sal) as maxSal from emp group by deptno order by deptno) t on e.deptno=t.deptno and e.sal=t.maxSal2.哪些人的薪水在部门的平均薪水之上
第一步:取得每个部门平均薪水作为临时表t
SELECT DEPTNO, AVG(SAL) FROM emp GROUP BY DEPTNO;第二步:临时表t与emp表连接条件 e.deptno=t.deptno and e.sal>t.avgSal
SELECT t.*,e.ENAME,e.SAL FROM emp e JOIN (SELECT DEPTNO, AVG(SAL) AS avgSal FROM emp GROUP BY DEPTNO) t ON e.DEPTNO=t.DEPTNO AND e.SAL>t.avgSal ORDER BY DEPTNO;
3.取得部门中(所有人)平均的薪水等级
平均的薪水等级:先求出每个薪水对应的等级,然后找出薪水等级的平均值
平均薪水的等级:先求出每个部门的平均薪水,再根据平均薪水划分等级
SELECT e.ENAME,e.DEPTNO,e.SAL,s.GRADE FROM emp e JOIN salgrade s ON e.SAL BETWEEN s.LOSAL AND s.HISAL ORDER BY DEPTNO; SELECT e.DEPTNO,AVG(s.GRADE) FROM emp e JOIN salgrade s ON e.SAL BETWEEN s.LOSAL AND s.HISAL GROUP BY e.DEPTNO;
4. 不准用Max函数取得最高薪水(两种做法)
第一种方案:
SELECT ENAME,SAL FROM emp ORDER BY SAL DESC LIMIT 0,1;第二种方案:表的自连接
SELECT SAL FROM emp WHERE SAL NOT IN(SELECT DISTINCT a.SAL FROM emp a JOIN emp b ON a.SAL(SELECT MAX(SAL) FROM emp WHERE EMPNO NOT IN (SELECT DISTINCT MGR FROM emp WHERE MGR IS NOT NULL));
9.取出薪水最高的前5名员工(这里不需要考虑第6名与第5名工资一样的情况)
SELECT ENAME,SAL FROM emp ORDER BY SAL DESC LIMIT 5;
10.取出薪水最高的第六到第十名的员工
SELECT ENAME,SAL FROM emp ORDER BY SAL DESC LIMIT 5,5;
11.取得最后入职的5名员工
SELECT ENAME,HIREDATE FROM emp ORDER BY HIREDATE DESC LIMIT 5;
12.取得每个薪水等级有多少员工
第一步:取出每个员工薪水对应的等级
SELECT e.ENAME,e.SAL,s.GRADE FROM emp e JOIN salgrade s ON e.SAL BETWEEN s.LOSAL AND s.HISAL;
第二步:根据其等级进行分组并计数
SELECT s.GRADE,COUNT(*) FROM emp e JOIN salgrade s ON e.SAL BETWEEN s.LOSAL AND s.HISAL GROUP BY s.GRADE;
13.列出所有员工及其领导的名字
SELECT a.ENAME '员工',b.ENAME '领导' FROM emp a LEFT JOIN emp b ON a.MGR=b.EMPNO;
14.列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
SELECT a.EMPNO '员工号',a.ENAME '员工',a.HIREDATE,b.ENAME '领导',b.HIREDATE,d.DNAME '部门名称' FROM emp a JOIN emp b ON a.MGR=b.EMPNO JOIN dept d ON a.DEPTNO=d.DEPTNO WHERE a.HIREDATE=5;
17.列出薪资比“Smith”高的所有员工信息
SELECT ENAME,SAL FROM emp WHERE SAL >(SELECT SAL FROM emp WHERE ENAME='SMITH');
18.列出所有(“CLERK”)办事员的姓名及其部门名称,部门的人数
第一步:列出所有(“CLERK”)办事员的姓名及其部门名称 临时表t1
SELECT e.ENAME,e.JOB,d.DNAME,d.DEPTNO FROM emp e JOIN dept d ON e.DEPTNO=d.DEPTNO WHERE e.JOB='CLERK';
第二步:列出部门的人数 临时表t2
SELECT DEPTNO,COUNT(*) FROM emp GROUP BY DEPTNO;
第三步:两张临时表连接
SELECT t1.*,t2.deptCount FROM (SELECT e.ENAME,e.JOB,d.DNAME,d.DEPTNO FROM emp e JOIN dept d ON e.DEPTNO=d.DEPTNO WHERE e.JOB='CLERK') t1 JOIN (SELECT DEPTNO,COUNT(*) AS deptCount FROM emp GROUP BY DEPTNO) t2 ON t1.DEPTNO=t2.DEPTNO;