having子句适用于mysql中的where

时间:2014-04-21 08:25:32

标签: mysql sql group-by where having

这是架构 员工(姓名,性别,工资,deptName) 和名称是主键

SELECT deptname
FROM employee
WHERE sex=m
GROUP BY deptName HAVING avg(salary) >
  (SELECT avg(salary)
   FROM employee)

我想理解having avg(salary)部分实际上做了什么? 因为我们不包括薪水选择条款,

SELECT deptname
FROM employee
WHERE sex=m
GROUP BY deptName

这部分将给我一组deptName,只有一列没有别的,我想知道如何(平均(薪水))工作,它是从表中采取所有员工的平均或什么?

任何能告诉我的人 感谢

4 个答案:

答案 0 :(得分:1)

WHERE过滤 之前的记录HAVING会在之后过滤结果。使用函数或运算符的表达式可以在任一子句中使用(尽管像AVG()这样的聚合函数不能在WHERE子句中使用,因为在评估该子句时记录不会被分组。 / p>

因此,您的查询会过滤那些部门男性工人的平均工资大于整体(公司)平均工资的部门列表。

答案 1 :(得分:1)

SELECT AVG(salary)
   FROM employee

首先通过上述查询,您将获得所有员工的平均工资。

现在你只得到平均工资大于所有员工平均工资的部门。

答案 2 :(得分:0)

having子句的作用类似于' group by deptName '子句的where条件。所有行都按deptName列的值分组。对于每个组,平均值是根据该特定组的薪水值计算的。

因此,对于所有组,只有当该特定“deptName”组的平均工资大于所有员工的平均工资时,才会显示该组中的行。

答案 3 :(得分:0)

具有类似WHERE子句但其聚合函数类似于AVG。

所以你的查询会查找每个deptname的平均值。但在您的查询中

 having avg(salary) > (select  avg(salary) from employee)

你可能想要给出平均值来与之比较。

   having avg(salary) > 25 

因此,这将只选择那些平均值为> 25。