SELECT list is not in GROUP BY clause and contains nonaggregated column

1. 问题描述

MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。说白了就是select 后面不能直接跟非在group by 后面出现的字段

错误示例

select id,name,age from student group by age 

2. 解决方法

这种只是屏蔽报错,并不能真正解决问题, 但有些业务确实需要上面那种错误示例。

select any_value(id) as id, any_value(name) as name, `age` from student group by age
### 回答1: 这个错误是由于SQL查询语句中的选择列表包含了未被分组且未聚合的列,而且在GROUP BY子句中没有包含该列所导致的。 简单来说,当你在SQL查询中使用了GROUP BY子句时,选择列表中只能包含被分组的列或者使用了聚合函数(例如SUM,COUNT等)的列。如果你选择列表中包含了未被分组且未聚合的列,那么就会出现这个错误。 要解决这个问题,你需要将选择列表中未被分组且未聚合的列从列表中删除,或者将这些列也加入到GROUP BY子句中,以便让查询语句能够正确地运行。 ### 回答2: 在MySQL中,当我们执行一个SELECT语句时,在GROUP BY子句中同时使用了聚合和非聚合列时,会出现“select list is not in group by clause and contains nonaggregated column”的错误。 这是因为在GROUP BY子句中使用聚合函数时,MySQL会将结果集按照指定的列进行分组。如果我们使用了非聚合列,MySQL就无法确定这些列的值是何意义下的结果,因为这些列的值在每一组中可能是不同的。因此,我们需要在GROUP BY子句中将所有的非聚合列都列出来,以便MySQL能够正确的计算。否则,MySQL就会认为我们在使用了无效的SQL语句。 解决这个问题有两种方法: 第一种是可以将所有的非聚合列都列出来,在GROUP BY子句中进行分组。例如: SELECT column1, column2, SUM(column3) FROM table_name GROUP BY column1,column2; 这个语句中,我们将所有的列都列出来,并在GROUP BY子句中指定了需要按照column1和column2进行分组的结果集。这样MySQL就能够正确计算了。 第二种方法是使用MySQL的扩展功能——ONLY_FULL_GROUP_BY模式。当我们开启ONLY_FULL_GROUP_BY模式时,MySQL会在使用GROUP BY子句时进行强制性检查,如果存在非聚合列而没有在GROUP BY子句中列出来,则会报错。开启ONLY_FULL_GROUP_BY模式可以防止我们在GROUP BY子句中出现这种错误。可以通过以下语句开启这个模式: SET sql_mode=ONLY_FULL_GROUP_BY; 总的来说,我们在使用GROUP BY子句时需要遵循的规则就是将所有的非聚合列都列出来,在ONLY_FULL_GROUP_BY模式下强制性检查,避免出现“select list is not in group by clause and contains nonaggregated column”的错误。 ### 回答3: select list is not in group by clause and contains nonaggregated column 这个错误是由于 SQL 语句中既有 GROUP BY 子句,又有未被聚合的列,导致的。SQL 中 GROUP BY 子句用来对数据进行聚合,合并重复行,并返回唯一值,而未被聚合的列则既包含了不同值,还包含了重复值,导致了错误的产生。 例如,下面的 SQL 语句会报错: SELECT department_name, SUM(salary) FROM employee GROUP BY department_name HAVING SUM(salary) > 10000 ORDER BY salary DESC; 这里的语句将员工表员工工资按照部门进行分组,并计算每个部门的薪资总和,然后对总薪资进行筛选,保留薪资大于 10000 的部门,并按降序排列。但是,这个 SQL 语句却有错误,因为 select list 中的 department_name 没有参与聚合函数,而在 GROUP BY 子句中也没有包含这个列。 为了解决错误,我们需要将 department_name 列添加到 GROUP BY 子句中,如下所示: SELECT department_name, SUM(salary) FROM employee GROUP BY department_name HAVING SUM(salary) > 10000 ORDER BY SUM(salary) DESC; 这里,我们将 department_name 添加到 GROUP BY 子句中,使 select list 中的列也被分组,同时将 ORDER BY 子句更改为按薪资总和进行排序。这样,就可以正确执行 SQL 语句了。 综上所述,产生 select list is not in group by clause and contains nonaggregated column 错误的主要原因是 GROUP BY 子句和未被聚合的列之间不匹配,需要保证 select list 中的列都参与到 GROUP BY 子句或聚合函数中,并且按需要调整 ORDER BY 子句的顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值