有子句适用于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的主要内容,如果未能解决你的问题,请参考以下文章