sql:查询工资低于所在部门平均工资的员工的姓名和工资

上一篇 / 下一篇  2012-03-02 16:53:00 / 个人分类:数据库


6qbz#?|0
见过这么一道sql的题
51Testing软件测试网Lj#O5bz8?la
查询工资低于所在部门平均工资的员工的姓名和工资

s;[d6D-v[_%_g[!E6_0
员工表emp(id,name,dept_id,salary,) 部门表dept(id,name)
51Testing软件测试网F&E6S"t lIr

.p'x'YcfK9w-f4eC0
如果聪明的你,认为你不用查度娘谷歌能正确写出来,那么恭喜你,你可以不用朝下看了

,q*S5B#N{i?Ldb0
51Testing软件测试网 ^'s0QCP;y/_
看到有人这么写
select e.name,salary,avg(salary)
from emp e,dept d
where e.dept_id=d.id
group by e.dept_id
having salary<avg(salary)
51Testing软件测试网-[[{1HvR3AT
很明显写错了,其实这个语句不用查询dept表的,而且这样只是查出了比整个表平均工资小的记录,而不是所在部门的平均工资,注意这个所在部门,是关键,

^r#~R'x RktD\0
比较常用的2种写法:
51Testing软件测试网H j7G+q,L xhI
1.
select a.name, a.salary from 
emp a 
where salary<(select avg(salary)from emp where a.dept_id=dept_id group by 

NdW2{ Iv0
dept_id);
2.
select a.name,a.salary from 
emp a,
(select dept_id, avg(salary) avge from emp group by dept_id) b 
where a.salary<avge and a.dept_id=b.dept_id;

#_/i)H-vt:B5x1u2W0
如果是oracle,还可以使用partition by
select * from
(select a.name,a.salary,avg(a.salary) over (PARTITION BY dept_id) as Average from 
51Testing软件测试网jn&Gm+M!g@#iF
emp a)
where salary < Average
51Testing软件测试网4M^F0W9~*B
这篇帖子介绍了其他分析函数使用partition by的情形,很详细,值得一看
http://hi.baidu.com/wangzhiqing999/blog/item/f4a845660a5352cbe7113a88.html

TAG:

 

评分:0

我来说两句

Open Toolbar