京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

MySQL中ONLY_FULL_GROUP_BY模式的利用

2024-11-2 22:39| 发布者: 44f6fa4f5| 查看: 127| 评论: 0

摘要: 目录一、GROUP BY利用时的关键要点1. 明确 GROUP BY 的作用2. 服从 ONLY_FULL_GROUP_BY 规则3. 利用 HAVING 举行条件过滤4. 正确排序结果5. 留意空值和 NUL
目录

引言:作为一个菜鸟,当写sql中涉及到[code]group by[/code]这样简单的语句时,也会出现题目,我在牛客网上做sql题时,总报这个错:

在这里插入图片描述

[code]ONLY_FULL_GROUP_BY [/code]到底是什么东西呢?

今天写篇文章解释一下。

一、GROUP BY利用时的关键要点

1. 明确 GROUP BY 的作用

[code]GROUP BY[/code] 用于将数据集分割成多个组,每个组由一组具有相同属性的行组成。这使得聚合函数可以应用于每一组,而不是整个数据集。比方,利用 [code]GROUP BY[/code] 可以按产物种别统计贩卖总额。

2. 服从 ONLY_FULL_GROUP_BY 规则

在 MySQL 中,假如启用了 [code]ONLY_FULL_GROUP_BY[/code] 模式,那么 [code]SELECT[/code] 子句中除聚合函数之外的全部列都必须在 [code]GROUP BY[/code] 子句中出现。这是为了制止不确定性和潜伏的数据歧义。

3. 利用 HAVING 举行条件过滤

[code]HAVING[/code] 子句用于对分组后的结果举行过滤,类似于 [code]WHERE[/code] 子句,但 [code]HAVING[/code] 适用于聚合结果。比方,你可以利用 [code]HAVING COUNT(*) > 1[/code] 来找出至少出现两次的组。

4. 正确排序结果

虽然 [code]GROUP BY[/code] 自身不会自动排序结果,但你通常会希望在结果会合应用 [code]ORDER BY[/code] 来排序分组。比方,你可以按贩卖额降序排序产物种别。

5. 留意空值和 NULL 值

在 [code]GROUP BY[/code] 中,NULL 值会被视为相同的值,这意味着全部包罗 NULL 的行会被归入同一组。假如必要区分 NULL 和非 NULL 值,可以利用 [code]COALESCE()[/code] 大概条件表达式。

二、 ONLY_FULL_GROUP_BY 规则

1. 什么是 ONLY_FULL_GROUP_BY?

[code]ONLY_FULL_GROUP_BY[/code] 是 MySQL 中的一个 SQL 模式,它要求在任何包罗聚合函数的查询中,全部在 [code]SELECT[/code] 子句中出现的非聚合列也必须在 [code]GROUP BY[/code] 子句中出现。换句话说,假如一个查询利用了聚合函数,那么除了聚合函数包裹的列以外,全部在 [code]SELECT[/code] 子句中出现的列都必须被 [code]GROUP BY[/code] 子句引用。

这个规则确保了查询结果的确定性和划一性,制止了由于 SQL 语句的暗昧性而导致的潜伏错误。

2. 为什么必要 ONLY_FULL_GROUP_BY?

在 [code]ONLY_FULL_GROUP_BY[/code] 被引入之前,MySQL 答应在没有 [code]GROUP BY[/code] 大概 [code]GROUP BY[/code] 不充分的情况下举行查询。这意味着,即使查询中包罗了没有被聚合的列,MySQL 也会返回任意一个结果,这大概会导致误导性的结果或数据丢失。

比方,假设我们有以下查询:

[code]SELECT prod_name, COUNT(order_num) FROM products p JOIN orders o ON p.prod_id = o.prod_id; [/code]

这里,[code]prod_name[/code] 列没有被聚合函数包裹,也没有在 [code]GROUP BY[/code] 子句中出现。在 [code]ONLY_FULL_GROUP_BY[/code] 模式下,这个查询会失败,由于 MySQL 不知道如何从多个大概的 [code]prod_name[/code] 值中选择一个来展示。

3.如何启用或禁用 ONLY_FULL_GROUP_BY?

在 MySQL 中,默认情况下 [code]ONLY_FULL_GROUP_BY[/code] 是启用的。你可以通过检查 [code]@@sql_mode[/code] 体系变量来确认这一点:

[code]SELECT @@sql_mode; [/code]

假如 [code]ONLY_FULL_GROUP_BY[/code] 已经被启用,而且你想要临时禁用它(尽管这不是一个推荐的长期办理方案),你可以通过以下下令在会话级禁用它:

[code]SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); [/code]

大概,你也可以在 MySQL 设置文件(my.cnf 或 my.ini)中修改 [code]sql_mode[/code] 设置来全局禁用它。

总结

虽然禁用 [code]ONLY_FULL_GROUP_BY[/code] 大概会方便一些查询的编写,但从久远来看,遵照这个规则对于保持数据查询的准确性和划一性至关重要。在编写 SQL 查询时,始终应确保遵照 [code]ONLY_FULL_GROUP_BY[/code] 的引导原则,以制止潜伏的数据解释错误。

到此这篇关于MySQL中ONLY_FULL_GROUP_BY模式的利用的文章就先容到这了,更多相关MySQL ONLY_FULL_GROUP_BY 内容请搜索脚本之家从前的文章或继续浏览下面的相关文章希望各人以后多多支持脚本之家!


来源:https://www.jb51.net/database/327183o6w.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-4 18:22 , Processed in 0.047651 second(s), 18 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部