【问题标题】:ERROR 1111 (HY000): Invalid use of group functionERROR 1111 (HY000): 组函数使用无效
【发布时间】:2015-01-27 13:44:42
【问题描述】:

给定一个具有以下属性的人员表:

ec,name,code,dob,salary

列出收入高于平均工资的员工。

我的解决方案:

select* from staff where salary > avg(salary);

这有什么问题?

【问题讨论】:

    标签: sql


    【解决方案1】:

    聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。

    使用WHERE 子句的示例:

    select *
    from staff 
    where salary > (select avg(salary) from staff)
    

    使用HAVING 子句的示例:

    select deptid,COUNT(*) as TotalCount
    from staff
    group by deptid
    having count(*) > 2
    

    Having 子句指定组或聚合的搜索条件。 HAVING 只能与 SELECT 语句一起使用。 HAVING 通常用在 GROUP BY 子句中。当不使用GROUP BY 时,HAVING 的行为类似于WHERE 子句。

    【讨论】:

    • 为什么会这样?为什么可以在where子句中使用count(*)?
    • @jaig:您不能在 where 子句中使用 count(*)。请参阅我的答案中的编辑。
    • 另一个疑问...为什么我不能执行以下操作:从薪水 > avg(salary) 的员工中选择*,但我可以执行以下操作:从薪水 > 200 的员工中选择*
    • @jaig:因为,它充当了一个简单的 where 子句。请参阅我编辑的答案的最后一部分。如果您满意,请随时接受答案。
    • @TuğberkKaanDuman:当然,您可以在同一个查询中使用 where 和 group by。问题是关于使用聚合函数 in where 子句。 eg:不能查询SELECT * FROM SALARY WHERE count(SICKLEAVE) > 30 ;
    猜你喜欢
    • 2018-05-14
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多