SQL查询报错Error Code:1055,请求分析原因及解决办法
问题排查与解决方案
报错核心原因
你的查询触发Error Code: 1055,本质是MySQL开启了only_full_group_by默认严格模式,该模式有明确规则:
- SELECT列表中的非聚合列(比如
id、name这类未被SUM/COUNT等聚合函数包裹的列),必须要么出现在GROUP BY子句中,要么被GROUP BY的列函数依赖(比如主键自动依赖唯一分组键,但这里GROUP BY的是salary,并非主键)。 - 你用
SELECT *会取出employee表所有列,其中id、name等非聚合列既不在GROUP BY(仅包含salary)里,也不依赖于salary(同一薪资可对应多个不同id的员工),直接违反了模式规则。
需求匹配的修正方案
你要实现“显示薪资高于平均薪资的员工数据并按薪资分组”,需根据真实需求分两种情况处理:
情况1:仅展示符合条件的员工并按薪资排序(最可能的真实需求)
如果不需要聚合统计,只是要筛选出薪资高于平均的员工并按薪资排列,不需要GROUP BY,直接用ORDER BY即可:
SELECT * FROM db_hr.employee WHERE salary > (SELECT AVG(salary) FROM db_hr.employee) ORDER BY salary; -- 默认升序,加DESC可改为降序
情况2:确实需要按薪资分组做聚合统计
如果是要统计每个薪资档位下的员工数据(比如每个薪资的员工数量、id列表等),需调整SELECT列,要么只保留GROUP BY列和聚合列,要么用聚合函数处理非分组列:
-- 示例:统计每个薪资的员工数量及对应员工id列表 SELECT salary, COUNT(*) AS employee_count, GROUP_CONCAT(id) AS employee_ids -- 用聚合函数拼接同薪资的员工id FROM db_hr.employee WHERE salary > (SELECT AVG(salary) FROM db_hr.employee) GROUP BY salary;
-- 示例:仅保留分组列和必要聚合结果 SELECT salary, MAX(name) AS representative_employee -- 取同薪资下任意一名员工的姓名(可根据需求替换聚合函数) FROM db_hr.employee WHERE salary > (SELECT AVG(salary) FROM db_hr.employee) GROUP BY salary;
额外说明
如果非要临时关闭only_full_group_by模式(不推荐,会导致数据逻辑混乱),可执行以下命令(重启MySQL后失效):
SET sql_mode = (SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
但这种做法会让MySQL返回不确定的非聚合列值(比如同一薪资下随机返回一名员工的id),严重影响数据一致性,不建议使用。
内容的提问来源于stack exchange,提问作者Theoz06
相关产品推荐
相关产品推荐

