Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
having子句与mysql中的where一起使用_Mysql_Sql_Group By_Where_Having - Fatal编程技术网

having子句与mysql中的where一起使用

having子句与mysql中的where一起使用,mysql,sql,group-by,where,having,Mysql,Sql,Group By,Where,Having,这是模式 员工(姓名、性别、工资、部门名称) 名称是主键 SELECT deptname FROM employee WHERE sex=m GROUP BY deptName HAVING avg(salary) > (SELECT avg(salary) FROM employee) 我想了解具有平均工资的部分该部分实际上做什么? 由于我们不包括工资选择条款 SELECT deptname FROM employee WHERE sex=m GROUP BY deptNam

这是模式 员工(姓名、性别、工资、部门名称) 名称是主键

SELECT deptname
FROM employee
WHERE sex=m
GROUP BY deptName HAVING avg(salary) >
  (SELECT avg(salary)
   FROM employee)
我想了解具有平均工资的部分
该部分实际上做什么? 由于我们不包括工资选择条款

SELECT deptname
FROM employee
WHERE sex=m
GROUP BY deptName
这一部分将给我一组deptName,只有一列没有其他内容,我想知道have(avg(salary))是如何工作的,它是从表中获取所有员工的avg还是什么

谁能告诉我
感谢

having子句的工作方式类似于“groupby deptName子句的where条件。所有行都按deptName列的值分组。对于每个组,平均值是根据该特定组的工资值计算的


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

having is like WHERE子句,但其用于AVG等聚合函数

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

 having avg(salary) > (select  avg(salary) from employee)
你可能想给出一个平均值来比较


因此,这将只选择平均值>25的记录。

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

因此,您的查询会筛选出一个部门列表,其中该部门男性员工的平均工资高于整体(公司)平均工资

SELECT AVG(salary)
   FROM employee
通过以上查询,您将首先获得所有员工的平均工资


现在你得到的是唯一一个平均工资高于所有员工平均工资的部门。

它什么也不做?我读到它得到的是男性员工的平均工资,这让我感到困惑是的,它选择了平均值,然后你只想选择高于实际平均值的平均值。我认为这个查询不做任何事情是错误的,因为这将提供其平均工资(部门)的所有部门名称大于所有员工的平均工资。这不是我的问题,我知道我们不能在where子句中使用聚合函数,我只是想知道在这种情况下,avg(工资)的作用是什么。它返回部门的平均工资,但只有男性员工。我们不需要在select语句中使用avg(工资)?我想你说的是avg(工资)而不是平均(工资)…如果是这样,我想澄清您,这里您的查询不是获取平均工资,但这里平均(工资)是筛选数据的条件…希望您将得到查询的答案。是的,如果您希望部门平均工资与其名称一起,那么您也应该在选择中使用。
SELECT AVG(salary)
   FROM employee