黑八尾猫 2019-05-19 20:17 采纳率: 50%
浏览 330
已采纳

程序员新手对于一段sql语句的疑问

题目是这样的:

查询出个人工资高于其所在部门平均工资的员工,列出这些员工的全部个人信息

表employees的结构:

create table employees (

employee_id int primary key, //员工ID

first_name varchar(25),

last_name varchar(25),

salary double, //工资

hired_date date,

department_id int //所在部门ID

)

在看答案前,我自己写的sql语句:

第一种查询方法:

select e1.* from employees e1 
where e1.salary>
(
    select avg(e2.salary) salary from employees e2
    where e1.department_id=e2.department_id 
) 

第二种查询方法:

select e1.* from employees e1, 
( 
    select department_id, avg(salary) salary from employees 
    group by department_id
) e2
where e1.department_id=e2.department_id and e1.salary>e2.salary

结果给出的答案简洁好多:

select e1.*
from employees as e1
where  e1.salary >
(
    select  AVG(e2.salary)
    from  employees as e2
    where  e1.department_id=e2.department_id
)

看到这个我明白了主查询语句的表别名e1就像成员变量一样可以在子查询中使用,不知道对不对。

但完全想不明白的是,答案的子查询只是用了where子句自连接了两张表的department_id,怎么实现的分组?这是个什么思路或者优化吗?原理是什么?

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-05-19 21:50
    关注

    个人工资高于其所在部门平均工资的员工,并不需要分组啊。
    最后一个答案的子查询就是计算所在组的平均工资,而且这种写法看上去简洁,但是效率并不高,因为每个员工都要算一次所在部门的平均工资,无论这个部门有几个员工

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 写uniapp时遇到的问题
  • ¥15 vs 2008 安装遇到问题
  • ¥15 matlab有限元法求解梁带有若干弹簧质量系统的固有频率
  • ¥15 找一个网络防御专家,外包的
  • ¥100 能不能让两张不同的图片md5值一样,(有尝)
  • ¥15 informer代码训练自己的数据集,改参数怎么改
  • ¥15 请看一下,学校实验要求,我需要具体代码
  • ¥50 pc微信3.6.0.18不能登陆 有偿解决问题
  • ¥20 MATLAB绘制两隐函数曲面的交线
  • ¥15 求TYPCE母转母转接头24PIN线路板图