You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中不搭配GROUP BY使用HAVING为何无法运行?原因解析

问题解析:为什么这条SQL无法运行?

先看你给出的SQL语句:

SELECT * 
FROM employees 
HAVING salary = MAX(salary);

核心原因

HAVING子句的本质是过滤分组后的聚合结果,它必须配合GROUP BY使用(或隐式的全表分组,但此时有严格限制):

  • 没显式写GROUP BY时,数据库会把整个表当作一个单一分组。但你用SELECT *要返回所有行,MAX(salary)却是整个分组的唯一聚合值,数据库没法将每行的salary字段和这个全局聚合值做匹配——HAVING在这里是对分组过滤,不是对每行过滤。
  • 另外,多数SQL数据库(比如MySQL、PostgreSQL)不允许在无GROUP BY的情况下,同时查询非聚合列(比如SELECT *里的所有字段)和聚合函数(比如MAX(salary)),这违反了单值规则:一个分组只能返回一个聚合结果,不能同时返回多行的非聚合字段。

正确写法示例

如果要找出工资最高的员工,常用两种方式:

方式1:子查询匹配最高工资

SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

方式2:窗口函数(支持窗口函数的数据库适用)

SELECT *
FROM (
    SELECT *,
           RANK() OVER (ORDER BY salary DESC) AS salary_rank
    FROM employees
) AS ranked_employees
WHERE salary_rank = 1;

这种写法还能处理多个员工工资并列最高的场景。

内容的提问来源于stack exchange,提问作者salim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:34:52