分析

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

开发工具与关键技术:Oracle sql*plus  PLSQL Developer

作者:朱海恩

撰写时间: 2019.03.16

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我们一般在做题时,首先要对题目进行分析,知道有什么要查询的字段数据和有那些过滤要求,我们与下面的题目为列:

题目:查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email,

salary

(1)查询出 employee_id的员工的 last_name, department_id, email, salary

Select last_name, department_id, email, salary

From employees;

 

(2)查询各个部门中平均工资是多少,这是要对部门进行分组group  by

Select avg(salary)

From employees

Group by department_id;

 

(3)题目要求是部门中最高的平均工资,那么我们要对分组函数进行嵌套

Select max(avg(salary))

From employees

Group by department_id;

 

(4)接下来我们需要知道最高工资的部门id是多少,从而把(3)做子查询语句,因为子查询的查询字段是分组函数,所以左边也要用分组函数进行比较

Select department_id  from employees  group by department_id

Having avg(salary) = (

Select max(avg(salary))  from employees  group by department_id)

 

(5)查询出(4)对应的部门的 manager_id

Select manager_id  from departments

Where department_id = (

Select department_id  from employees  group by department_id

Having avg(salary) = (select max(avg(salary))  from employees

Group by department_id))

 

(6)最后,查询出 employee_id 为(5)查询的manager_id,如图1

         Select last_name, department_id, email, salary  FROM employees

         Where employee_id = (

         Select manager_id  from departments  where department_id = (

         Select department_id  from employees  group by department_id

Having avg(salary) = (select max(avg(salary))  from employees

         Group by department_id)));

分析

图1

刚开始做的时候,想着manager_id和department_id在员工表都有,就直接把第(4)步省略掉,直接就manager_id,如图2

分析

图2