IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 解决MySQL only_full_group_by错误 -> 正文阅读

[大数据]解决MySQL only_full_group_by错误

解决MySQL only_full_group_by错误

参考文章:https://blog.csdn.net/weixin_43064185/article/details/99646535

1. 问题

在执行sql语句的分组时我们有时会遇到以下的问题:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘trial.B.dname’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
?

错误1055 (42000):SELECT list的表达式#1不在GROUP BY子句中,并且包含非聚合列的trial.B。dname不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容

原因 :mysql 5.7及以上版本默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"
可以通过SELECT VERSION()查询是否是版本问题
通俗的解释就是
输出的结果是叫target list,就是select后面跟着的字段,还有一个地方group by column,就是
group by后面跟着的字段。由于开启了ONLY_FULL_GROUP_BY的设置,如果一个字段没有在target list和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误。

聚合字段:可以理解为结果很重要的
非聚合字段:取值是其第一个匹配到的字段内容,可以理解为结果很随意-不重要

那么就直接进入正题

2. 解决

在解决问题之前我们先查看一下我们MySQL的模式(方便copy)

查看sql_mode

SELECT @@sql_mode;

我们就会得到如下的结果

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

接下来就是解决问题了,我们有三种解决该问题的方法

第一种-永久关闭only_full_group_by模式:

  • 去掉ONLY_FULL_GROUP_BY
  • 修改配置文件:
    image.pngimage.png
  • 添加这个字段
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION  

第二种-临时关闭only_full_group_by模式:

  • 打开cmd登录进数据库
  • 然后执行

set global sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’;

这个方法只在当前登录有效,数据库重启就需要重新设置
第三种-使用ANY_VALUE(非聚合列):

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

原理就是从分组中,随意获取一个数据,前提也就是你不关心组数据中的不同情况。简单点就是和去重差不多的

3. 总结

来个小小的总结:

这个问题最经常出现的地方是分组时在同一个组里面的数据是各不相同的(这个问题可以使用ANY_VALUE(非聚合列)解决,但是前提是不关心这个结果的)和 查询多个字段并且对一个字段使用聚合函数,那么其他字段有多个值而使用聚合函数的就只有一个值(这种情况可以考虑进行联表查询)

4. 扩展

SQL92标准的group by :
SELECT、HAVING、ORDER后的非聚合字段必须和GROUP BY后的字段保持完全一致

SQL 99标准的group by:
如果group by后面的字段是主键(唯一键),而且非聚合字段是函数依赖group by后字段的,那么可以将这些非聚合字段放在SELECT、HAVING、ORDER BY的语句之后。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:37:32  更:2022-02-26 11:39:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:57:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码