有子句适用于mysql中的where

Posted

技术标签:

【中文标题】有子句适用于mysql中的where【英文标题】:having clause works with where in mysql 【发布时间】:2014-04-21 08:25:32 【问题描述】:

这是架构 员工(姓名、性别、薪水、部门名称) name 是主键

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

这部分将给我一组部门名称,只有一列没有其他内容,我想知道 (avg(salary)) 是如何工作的,它是从表中获取所有员工的平均值还是什么?

谁能告诉我 谢谢

【问题讨论】:

【参考方案1】:

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

因此,您的查询过滤了一个部门列表,找出该部门男性员工的平均工资高于总体(公司)平均工资的部门。

【讨论】:

这不是我的问题,我知道我们不能在 where 子句中使用聚合函数,我只是想知道在这种情况下拥有 avg(salary) 是什么【参考方案2】:
SELECT AVG(salary)
   FROM employee

首先通过上面的查询,你会得到所有员工的平均工资。

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

【讨论】:

得到它,它返回部门的平均工资,但只有男性员工 我们不需要在 select 语句中也使用 avg(salary) 吗? 我认为您是在说 avg(salary) 而不是 avg(salary)...如果是这样的话,我想澄清一下,这里您的查询不是获取平均工资,而是这里获取 avg(salary ) 是过滤数据的条件...希望您能得到查询的答案。 是的,如果您想要部门明智的平均工资以及他们的姓名,那么您也应该在 select 中使用。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

拥有类似于 WHERE 子句,但它用于聚合函数,例如 AVG。

因此您的查询将查找每个部门名称的平均值。但是在您的查询中

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

你可能想给出一个平均值来比较。

喜欢

   having avg(salary) > 25 

所以这只会选择平均> 25的人。

【讨论】:

它什么都不做?我读到它正在获得男性员工的平均工资,这让我感到困惑 是的,它会选择平均值,然后您只想选择大于实际平均值的平均值。 我认为这个查询什么都不做是错误的,因为这将提供所有部门名称,其平均工资(部门明智)大于所有员工的平均工资。

以上是关于有子句适用于mysql中的where的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - WHERE 子句中的 NOT IN 查询具有相同的结构,适用于第一个表但不适用于第二个表

在 c# where in 子句适用于整数?

[MySQL]select和where子句优化

mysql语句where条件中的是啥意思

where子句mysql中的MAX函数[重复]

where子句mysql中的MAX函数[重复]