6、列出所有“CLERK”(办事员)的姓名及其部门名称,部门的人数,工资等级。
1、确定所需要的数据表:
- emp表:找到办事员的姓名;
- dept表:部门名称;
- emp表:统计求出部门的人数;
- salgrade表:查询工资等级;
2、确定已知的关联字段:
- emp表和dept表:emp.deptno=dept.deptno;
- emp表和salgrade表:emp.sal BETWEEN salgrade.losal AND salgrade.hisal;
第一步:找到所有办事员的姓名
SELECT e.ename
FROM emp e
WHERE job=’CLERK’;
第二步:找到部门信息,引入dept表,同时增加消除笛卡尔积的条件
SELECT e.ename,d.dname
FROM emp e,dept d
WHERE job=’CLERK’ AND e.deptno=d.deptno;
第三步:部门人数需要额外的统计,但是本程序的查询里面已经不可能继续使用COUNT()函数,所以写子查询统计
SELECT e.ename,d.dname,temp.count
FROM emp e,dept d,(
SELECT deptno dno,COUNT(empno) count
FROM emp
GROUP BY deptno) temp
WHERE e.job=’CLERK’ AND e.deptno=d.deptno
AND d.deptno=temp.dno;
第四步:雇员的工资等级,继续引入salgrade表
SELECT e.ename,d.dname,temp.count,s.grade
FROM emp e,dept d,(
SELECT deptno dno,COUNT(empno) count
FROM emp
GROUP BY deptno) temp,salgrade s
WHERE e.job=’CLERK’ AND e.deptno=d.deptno
AND d.deptno=temp.dno
AND e.sal BETWEEN s.losal AND s.hisal;
7、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数及所在部门名称、位置、平均工资。
1、确定所需要的数据表:
- emp表:最低薪金大于1500的工作肯定需要使用emp表统计求出,以及可以求出雇员人数;
- dept表:求出些雇员所在的部门信息;
- emp表:统计求出部门的平均工资;
2、确定已知的关联字段:emp.deptno=dept.deptno;
第一步:使用emp表按照job分组,统计最低工资(HAVING)和人数
SELECT e.job,COUNT(e.empno)
FROM emp e
GROUP BY e.job
HAVING MIN(e.sal)>1500;
第二步:要查询出雇员所在的部门信息,但是以上的查询能跟dept表有关联吗?
以上的查询和dept表之间并没有关联字段,那么如果没有关联字段,一定会有笛卡尔积产生,但是多表查询必须要消除笛卡尔积,所以必须联系;
- 以上的查询可以和emp表的job字段关联;
- 要引入的dept表也可以和emp表的deptno字段关联;
SELECT temp.job,temp.count,d.dname,e.ename
FROM dept d,(
SELECT e.job job,COUNT(e.empno) count
FROM emp e
GROUP BY e.job
HAVING MIN(e.sal)>1500) temp,
emp e
WHERE e.deptno=d.deptno AND e.job=temp.job;
第三步:求出一个部门的平均工资,使用emp表在子查询中统计
SELECT temp.job,temp.count,d.dname,e.ename,res.avg
FROM dept d,(
SELECT e.job job,COUNT(e.empno) count
FROM emp e
GROUP BY e.job
HAVING MIN(e.sal)>1500) temp,
emp e,(
SELECT deptno dno,AVG(sal) avg
FROM emp
GROUP BY deptno) res
WHERE e.deptno=d.deptno AND e.job=temp.job
AND e.deptno=res.dno;
本题目之所以出的如此之复杂,目的是训练大家寻找关联字段的能力,但是本题目没有任何的意义,知道就行了。
8、列出在部门“SALES”(销售部)工作的员工姓名、基本工资、雇佣日期、部门名称、假定不知道销售部的部门编号。
1、确定所需要的数据表:
- emp表:员工姓名、基本工资、雇佣日期;
- dept表:找到销售部的部门编号、部门名称;
2、确定已知的关联字段:emp.deptno=dept.deptno;
SELECT e.ename,e.sal,e.hiredate,d.dname
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND d.dname=’SALES’;
9、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级。
1、确定所需要的数据表:
- emp表:可以求出公司的平均薪金;
- emp表:员工的信息;
- dept表:部门的信息;
- emp表:领导的信息;
- salgrade表:工资等级;
2、确定已知的关联字段:
- 雇员和部门:emp.deptno=dept.deptno;
- 雇员和领导:emp.mgr=memp.empno;
- 雇员和工资等级:emp.sal BETWEEN salgrade.losal AND salgrade.hisal;
第一步:求出公司的平均薪金
SELECT AVG(sal) FROM emp;
第二步:将以上的子查询放在WHERE子句之中,作为一个查询条件,求出满足此条件的雇员信息。
SELECT e.empno,e.ename,e.job,e.sal
FROM emp e
WHERE e.sal>(
SELECT AVG(sal) FROM emp);
第三步:找到部门的名称
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc
FROM emp e,dept d
WHERE e.sal>(
SELECT AVG(sal) FROM emp)
AND e.deptno=d.deptno;
第四步:找到领导的信息
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc,m.ename
FROM emp e,dept d,emp m
WHERE e.sal>(
SELECT AVG(sal) FROM emp)
AND e.deptno=d.deptno
AND e.mgr=m.empno(+);
第五步:找到工资等级
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc,m.ename,s.grade
FROM emp e,dept d,emp m,salgrade s
WHERE e.sal>(
SELECT AVG(sal) FROM emp)
AND e.deptno=d.deptno
AND e.mgr=m.empno(+)
AND e.sal BETWEEN s.losal AND s.hisal;