复杂查询案例

复杂查询案例

1.案例一

列出薪金高于在部门30工作的所有员工姓名和薪金、部门名称、部门人数。

  • 确定要使用的数据表:

    |-emp表:员工姓名和薪金

    |-dept表:部门名称

    |-emp表:统计出部门人数

  • 确定已知的关联字段:

    |-员工与部门:emp.deptno=dept.deptno

第一步:找到30部门所有雇员的薪金

复杂查询案例

第二步:以上查询中返回的是多行单列的数据,那么此时就可以使用三种判断符判断:IN ,ANY,ALL

现找到的是所有员工,使用“>ALL”.

复杂查询案例

第三步:要找到部门的信息,自然在FROM子句之后引入dept表,而后消除笛卡尔积(内连接)

复杂查询案例

第四步:需要统计出部门人数的信息

思考:

  • 如果要进行部门的人数统计,那么一定要按照部门分组

  • 在使用分组的时候,SELECT子句只能够出现分组字段与统计函数

    于是此时就出现了矛盾,因为SELECT子句里面有其他的字段,所以不可能直接使用GROUP BY分组,可以考虑利用子查询分组,即:在FROM子句之后使用子查询先进行分组统计,而后将临时表继续采用多表查询操作

    复杂查询案例

2.案例二

列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数,领导姓名

  • 确定要使用的数据表:

    |-emp表:员工信息

    |-dept表:部门名称

    |-emp表:领导信息

  • 确定已知的关联字段:

    |-雇员与部门:emp.deptno=dept.deptno

    |-雇员与领导:emp.mgr=memp.empno

第一步:找到SCOTT所做的工作

复杂查询案例

第二步:以上的查询返回的是单行单列,所以只能够在WHERE或者是HAVING中使用,那么根据现在的需求,在WHERE中使用,对所有的雇员信息进行筛选

复杂查询案例

第三步:如果不需要重复信息,那么可以删除SCOTT

复杂查询案例

第四步:部门名称只需要加入dept表即可

复杂查询案例

第五步:此时的查询不可能直接使用GROUP BY进行分组,所以需要使用子查询实现分组

复杂查询案例

第六步:找到对应的领导信息,直接使用自身关联

复杂查询案例

3.案例三

列出薪金比“SMITH”或“ALLEN”多的所有员工的编号、姓名、部门名称、其领导姓名、部门人数、平均工资、最高和最低工资。

  • 确定要使用的数据表:

    |-emp表:员工的编号、姓名

    |-dept表:部门名称

    |-emp表:领导姓名

    |-emp表:统计信息

  • 确定已知的关联字段

    |-雇员与部门:emp.deptno=dept.deptno

    |-雇员与领导:emp.mgr=memp.empno

第一步:知道“SMITH”或“ALLEN”,这个查询返回多行单列

复杂查询案例

第二步:使用ANY进行筛选,并且去掉SMITH和ALLEN

复杂查询案例

第三步:找部门名称

复杂查询案例

第四步:找领导信息

复杂查询案例

第五步:部门人数,平均工资、最高及最低工资。整个查询不能使用GROUP BY,利用子查询实现统计操作

复杂查询案例