MySQL第八个问题 使用group by报错sql_mode=only_full_group_by

问题:照着书敲
SELECT t_department.did, dname,COUNT(), AVG(t_employee.salary), MAX(t_employee.salary), MIN(t_employee.salary)
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
GROUP BY t_department.did;
报错:
[42000][1055] Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘atguigu_chapter7.t_department.dname’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决办法:上网上查询了下any_value()函数可以解决,将代码改为
SELECT t_department.did, ANY_VALUE(dname),COUNT(
), AVG(t_employee.salary), MAX(t_employee.salary), MIN(t_employee.salary)
FROM t_employee RIGHT JOIN t_department
ON t_employee.did = t_department.did
GROUP BY t_department.did;
即可解决。
问了下ai对any_value()的解释,解释如下:
在 MySQL 中,ANY_VALUE() 是一个聚合函数,用于返回被聚合的第一行的列值。它通常用于避免在使用 GROUP BY 时对非分组列进行选择而导致的错误。当查询结果只需要一行记录,并且不需要保证特定的值时,可以使用 ANY_VALUE()。
使用场景:
当你有一个表,并且你想基于某些列进行分组,但同时又想选择那些没有包含在 GROUP BY 子句中的其他列时,可以使用 ANY_VALUE() 来避免错误。
示例:
假设我们有一个名为 employees 的表,结构如下:
CREATE TABLE employees (
id INT AUTO_INCREMENT,
name VARCHAR(50),
department_id INT,
salary DECIMAL(10, 2),
PRIMARY KEY (id)
);
如果我们要按部门分组并选择每个部门的第一个员工的名字和薪水,可以使用 ANY_VALUE() 如下:
SELECT
department_id,
ANY_VALUE(name) AS any_name,
ANY_VALUE(salary) AS any_salary
FROM
employees
GROUP BY
department_id;
注意事项:
ANY_VALUE() 返回的是分组中的任意一个值,不一定是第一个或最后一个。
这个函数主要用于优化性能,减少数据传输量,但在需要精确值的情况下应谨慎使用。
通过这种方式,你可以有效地处理分组查询,同时避免因缺少 GROUP BY 列而产生的错误。

家人们,要是需要查询的有多条记录这个办法就会失效的,例如:
SELECT t_employee.did,ANY_VALUE(t_department.dname), ANY_VALUE(t_employee.ename), COUNT(*)
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did
WHERE salary > 8000
GROUP BY t_employee.did;
我在表里每个部门是有多条记录符合查询条件的,但是由于 ANY_VALUE() 是一个聚合函数,用于返回被聚合的第一行的列值所以只能每个部门返回一行
在这里插入图片描述就像上述返回结果那样,明明满足条件的一和五部门都有两人,但是只会返回一行。

但是其实GROUP BY是聚合函数,分组字段值相同的行只会得到一行结果 就算没有sql_mode=only_full_group_by这个报错,他也只会每个部门显示一行。可以通过GROUP_CONCAT()函数来将各个字段的值显示出来,如下:
SELECT t_employee.did,ANY_VALUE(t_department.dname), GROUP_CONCAT(ANY_VALUE(t_employee.ename)), COUNT(*)
FROM t_employee INNER JOIN t_department
ON t_employee.did = t_department.did
WHERE salary > 8000
GROUP BY t_employee.did;
结果就会如期显示:
在这里插入图片描述

MySQL报错sql_mode=only_full_group_by是因为MySQL 5.7版本默认设置了mysql sql_mode = only_full_group_by属性。这个属性要求在进行GROUP BY操作时,SELECT语句中的字段必须是GROUP BY字段或使用聚合函数进行计算的字段。如果SELECT语句中出现了非GROUP BY字段且没有使用聚合函数,就会导致报错。 只允许使用GROUP BY字段或使用聚合函数进行计算的字段,可以确保查询结果的准确性。但有时候我们希望在GROUP BY操作中使用GROUP BY字段,可以通过在查询中使用聚合函数any_value(field)来实现。any_value(field)函数允许非GROUP BY字段的出现,它会返回字段在GROUP BY结果集中的任意一个值,关闭only_full_group_by模式后,可以使用这个函数来获取非GROUP BY字段的值。 要查看当前的sql_mode设置,可以使用如下命令:SELECT @@sql_mode; 该命令会返回当前的sql_mode值,如果其中包含了only_full_group_by,说明该模式是开启状态。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MySQL sql_mode=only_full_group_by问题解决办法](https://blog.csdn.net/qiuziqiqi/article/details/109614532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [MySQL错误sql_mode=only_full_group_by完美解决方案](https://blog.csdn.net/u011414736/article/details/125676859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值