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;