MySQL中ONLY_FULL_GROUP_BY模式的使用

 更新时间:2024年09月10日 11:18:47   作者:Frank牛蛙  
ONLY_FULL_GROUP_BY是MySQL中一个重要的SQL模式,确保在使用GROUP BY时,所有非聚合函数列必须在GROUP BY子句中出现,避免数据歧义和不确定性,下面就来介绍一下具体使用

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

在这里插入图片描述

ONLY_FULL_GROUP_BY 到底是什么东西呢?

今天写篇文章解释一下。

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

1. 理解 GROUP BY 的作用

GROUP BY 用于将数据集分割成多个组,每个组由一组具有相同属性的行组成。这使得聚合函数可以应用于每一组,而不是整个数据集。例如,使用 GROUP BY 可以按产品类别统计销售总额。

2. 遵守 ONLY_FULL_GROUP_BY 规则

在 MySQL 中,如果启用了 ONLY_FULL_GROUP_BY 模式,那么 SELECT 子句中除聚合函数之外的所有列都必须在 GROUP BY 子句中出现。这是为了避免不确定性和潜在的数据歧义。

3. 使用 HAVING 进行条件过滤

HAVING 子句用于对分组后的结果进行过滤,类似于 WHERE 子句,但 HAVING 适用于聚合结果。例如,你可以使用 HAVING COUNT(*) > 1 来找出至少出现两次的组。

4. 正确排序结果

虽然 GROUP BY 自身不会自动排序结果,但你通常会希望在结果集中应用 ORDER BY 来排序分组。例如,你可以按销售额降序排序产品类别。

5. 注意空值和 NULL 值

在 GROUP BY 中,NULL 值会被视为相同的值,这意味着所有包含 NULL 的行会被归入同一组。如果需要区分 NULL 和非 NULL 值,可以使用 COALESCE() 或者条件表达式。

二、 ONLY_FULL_GROUP_BY 规则

1. 什么是 ONLY_FULL_GROUP_BY?

ONLY_FULL_GROUP_BY 是 MySQL 中的一个 SQL 模式,它要求在任何包含聚合函数的查询中,所有在 SELECT 子句中出现的非聚合列也必须在 GROUP BY 子句中出现。换句话说,如果一个查询使用了聚合函数,那么除了聚合函数包裹的列以外,所有在 SELECT 子句中出现的列都必须被 GROUP BY 子句引用。

这个规则确保了查询结果的确定性和一致性,避免了由于 SQL 语句的模糊性而导致的潜在错误。

2. 为什么需要 ONLY_FULL_GROUP_BY?

在 ONLY_FULL_GROUP_BY 被引入之前,MySQL 允许在没有 GROUP BY 或者 GROUP BY 不充分的情况下进行查询。这意味着,即使查询中包含了没有被聚合的列,MySQL 也会返回任意一个结果,这可能会导致误导性的结果或数据丢失。

例如,假设我们有以下查询:

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

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

3.如何启用或禁用 ONLY_FULL_GROUP_BY?

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

SELECT @@sql_mode;

如果 ONLY_FULL_GROUP_BY 已经被启用,并且你想要暂时禁用它(尽管这不是一个推荐的长期解决方案),你可以通过以下命令在会话级禁用它:

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

或者,你也可以在 MySQL 配置文件(my.cnf 或 my.ini)中修改 sql_mode 设置来全局禁用它。

总结

虽然禁用 ONLY_FULL_GROUP_BY 可能会方便一些查询的编写,但从长远来看,遵循这个规则对于保持数据查询的准确性和一致性至关重要。在编写 SQL 查询时,始终应确保遵循 ONLY_FULL_GROUP_BY 的指导原则,以避免潜在的数据解释错误。

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

相关文章

  • RHEL 6平台MySQL数据库服务器的安装方法

    RHEL 6平台MySQL数据库服务器的安装方法

    这篇文章主要为大家详细介绍了RHEL 6平台MySQL数据库服务器的安装方法,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 怎样安全地关闭MySQL实例

    怎样安全地关闭MySQL实例

    这篇文章主要介绍了怎样安全地关闭MySQL实例,文中讲解非常细致,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-07-07
  • MySQL服务维护笔记

    MySQL服务维护笔记

    MySQL服务维护笔记...
    2006-12-12
  • MySQL系列之十五 MySQL常用配置和性能压力测试

    MySQL系列之十五 MySQL常用配置和性能压力测试

    今天给大家带来一篇教程关于MySQL常用配置和性能压力测试的知识,文中配置参数以32内存的服务器为例,通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-07-07
  • mysql慢查询介绍及开启技巧详解

    mysql慢查询介绍及开启技巧详解

    这篇文章主要为大家介绍了mysql慢查询介绍及开启技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • mysql之连接超时wait_timeout问题及解决方案

    mysql之连接超时wait_timeout问题及解决方案

    这篇文章主要介绍了mysql之连接超时wait_timeout问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 十个节省时间的MySQL命令小结

    十个节省时间的MySQL命令小结

    编者在工作中积累起来了一些MySQL命令行客户端技巧,这些技巧或多或少会帮助您节省大量的时间。
    2011-03-03
  • MySQL in太多过慢的三种解决方案

    MySQL in太多过慢的三种解决方案

    在MySQL中有一个配置参数eq_range_index_dive_limit,它的作用是一个等值查询(比如:in 查询),使用扫描索引树的方式分析在MySQL内部叫做index dives,使用索引统计的方式分析在MySQL内部叫做index statistics,本文给大家介绍了MySQL in太多过慢的三种解决方案
    2024-05-05
  • MySQL判断列的值既不为NULL又不为空字符串的问题

    MySQL判断列的值既不为NULL又不为空字符串的问题

    这篇文章主要介绍了MySQL判断列的值既不为NULL又不为空字符串的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 一文了解Mysql分区的使用

    一文了解Mysql分区的使用

    分区允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分,本文主要介绍了Mysql分区的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06

最新评论