mysql 的 sql_mode.only_full_group_by属性解析

article/2025/8/25 2:41:17

文章目录

    • 1. 初始条件
    • 2. 现象
    • 3. 解决
      • ①:关闭sql_mode 的 only_full_group_by模式
      • ②:使用 ANY_VALUE() 抑制 ONLY_FULL_GROUP_BY 的影响

mysql8.0官网:处理 group by

1. 初始条件

现在有这样一张表,其中有两条 name = 裤子 的数据
在这里插入图片描述

2. 现象

执行以下sql,想要得到按name分组的数据:GROUP BY name

SELECT name,author,SUM(price) FROM  `t_book`
GROUP BY name

在执行 sql 时 出现了 1055 异常

SELECT name,author,SUM(price) FROM  `t_book`
GROUP BY name
> 1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t_book.author' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
> 时间: 0.03s

在这里插入图片描述
按照错误提示,执行以下语句:GROUP BY name ,author,查询才不会报错

SELECT name,author,SUM(price) FROM  `t_book`
GROUP BY name ,author

查询结果:
在这里插入图片描述
         但是,这种查询已经脱离了我们原来的逻辑,我们是想要GROUP BY name,结果应只出现两条数据。而不是GROUP BY name ,author后的三条结果,那应该怎么做呢?

 

3. 解决

 

①:关闭sql_mode 的 only_full_group_by模式

         only_full_group_by 要求 group by 后边必须写满 select 后边的非函数列,所以我们只需要关闭only_full_group_by即可,关闭方式又分为 临时关闭永久关闭

  • 临时关闭:临时关闭又分为Session级 和 GLOBAL
    • Session:仅关闭当前会话设置,mysql重启后失效
    • GLOBAL:关闭全局设置,mysql重启后失效
  • 永久关闭:永久关闭only_full_group_by模式,这种方法需要在mysql的配置文件里修改,然后重启。
    1. 找到配置文件/etc/my.cnf(或则关联文件夹找到mysql-server.cnf)
    2. 在上述文件内的[mysqld]后追加sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION’
    3. 保存配置文件后,重启Mysql即可。

接下来演示一下关闭与打开Session级的sql_mode.only_full_group_by属性带来的影响!

查看 sql_mode属性

  • 查看Session级:SELECT @@sql_mode;
  • 查看 GLOBAL级:select @@GLOBAL.sql_mode;

查看Session级的 sql_mode属性,结果是可以看到带有ONLY_FULL_GROUP_BY属性的,所以我们GROUP BY name会报 1055 异常

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

在这里插入图片描述

接下来关闭Session级的 sql_mode属性

// 关闭 session级
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));// 关闭 GLOBAL级
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

再次select @@sql_mode;查询发现 sql_mode的值已经删除了ONLY_FULL_GROUP_BY属性

STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

然后再次执行如下sql

SELECT name,author,SUM(price) FROM  `t_book`
GROUP BY name 

执行结果:是按照我们的想法,返回了两条记录
在这里插入图片描述
注意:查询结果中,select后边的author属性由于没有使用聚合函数,所以只会返回原数据表中的第一条数据,使用时请注意!原数据如下
在这里插入图片描述

         

②:使用 ANY_VALUE() 抑制 ONLY_FULL_GROUP_BY 的影响

         如果不想关闭mysql的ONLY_FULL_GROUP_BY全局设置,仅仅想让当前sql忽略其影响,则可以使用ANY_VALUE(cloum) 忽略ONLY_FULL_GROUP_BY的影响,详见官方文档!

mysql8.0官网:ANY_VALUE(cloum) 可以抑制 ONLY_FULL_GROUP_BY 的影响

上面已经把ONLY_FULL_GROUP_BY属性关闭了,接下来打开它:

 // 打开`ONLY_FULL_GROUP_BY`属性SET SESSION sql_mode = sys.list_add(@@session.sql_mode, 'ONLY_FULL_GROUP_BY');

然后再去执行一下上面的sql,就会报1055异常了

SELECT name,author,SUM(price) FROM  `t_book`
GROUP BY name 

在这里插入图片描述

使用 ANY_VALUE()忽略ONLY_FULL_GROUP_BY的影响:

SELECT name,ANY_VALUE(author),SUM(price) FROM  `t_book`
GROUP BY name

结果如下:
在这里插入图片描述
正常出结果!


http://chatgpt.dhexx.cn/article/N4qNjkFO.shtml

相关文章

MYSQL 删除语句

删除数据(DELETE) 如果你失忆了,希望你能想起曾经为了追求梦想的你。 数据库存储数据,总会有一些垃圾数据,也会有一些不需要用的数据了,这些情况下,我们就可以删除这些数据,释放出一定的空间,给…

MySql递归RECURSIVE的详解

背景: 在实际开发的过程中,我们会遇到一些数据是层级关系的、要展示数据子父级关系的时候, 第一个解决方案:将数据库中的所有数据都查询出来用Java代码进行处理。 第二个解决方案:可以考虑MySql中的RECURSIVE递归进行…

【MYSQL WITH recursive使用】

MYSQL WITH recursive使用 MYSQL WITH recursive使用语法用法1:输出1~n或者求 1~n的和用法2 父求子创建table:user求张三后代 MYSQL WITH recursive使用 由于在项目中有使用到recursive,因此在此做记录 语法 WITH recursive 表名 AS ( 初始…

U 盘安装 CentOS7 时盘符和安装源不可用问题

记录一次在物理机上安装 CentOS7 遇到的问题及其解决办法,主要有两个问题卡住了很久,一个是盘符问题,一个就是安装源不可用的问题 。 1 No such device 1.1 问题描述 用 U 盘在物理机上安装 CentOS7 的时候,出现 could not ins…

Vmware Workstation17 安装centos7(详细教程)

1、为什么安装Vmware Vmware Workstation可以帮我们他们创建虚拟机,模拟生产环境(linux),搭建集群等。作为一个开发人员特别是后端开发人员是需要懂一些运维的,不需要精通,遇到问题能定位排查。我自己想做一个自己的项目&#xf…

用大白菜装centos7_大白菜安装centos7 踩坑记

1.准备一个U盘,安装大白菜。这个去大白菜官网下载安装就可以了 安装大白菜的时候最好选择FAT32(2021.1.7记录) 2.U盘装完大白菜后U盘会被分为两个主分区 一个盘是大白菜系统的,另外一个盘放一些工具的。 DBC里面就是放的一些工具 比如磁盘管理工具 3.把Centos7的镜像放入到DB…

Windows10安装Centos7双系统

Windows10安装Centos7双系统 1.摘要2.制作Centos 7系统盘3.Windows磁盘管理为Centos系统留出空间4.bios配置使得计算机系统选择从U盘进入5.安装Centos 7系统6.如何在Windows和Centos系统间切换7.一些问题与补救方法8.参考文章 1.摘要 本篇博客主要整理记录了在Win10 OS下安装使…

VM16上安装CentOS7详细安装教程【附图】

在VM16上安装Centos7 下载Centos安装Centos快照拍摄 下载Centos 进入Centos官网 Centos官网的下载地址 点击Download 点击x86_64 自己选择镜像下载 上面选择好自己的镜像后选择后缀名为 iso 的CentOS下载 安装Centos 点击创建新的虚拟机 选择好自定义后点击下一步…

VMware 16安装centos 7详细教程

VMware 16安装centos 7详细教程 前言:之前在VMware15 pro上安装centos7,但是启动虚拟机出现蓝屏,身边有好多小伙伴也遇到了这个问题,经过一番排查,找到了最简单的办法就是升级到VMware16pro,在启动就没有出…

在Vmware虚拟机中安装CentOS 7

前言:材料和工具 1. 安装好的VMWare虚拟机软件: ​VMWare16下载地址,获取码:ye1a 2.CentOS7下载地址:官方镜像下载 (centos.org) (官方镜像站下载比较慢) 清华大学镜像站:清华…

物理服务器安装CentOS 7操作系统

目录 1、下载系统镜像 2、制作安装盘 2.1 方法一:光盘制作 2.2 方法二:U盘制作 3、更改bios启动顺序 4、安装CentOS 7操作系统 4.1 安装命令选择,及常见错误解决 4.2 语言选择 4.3 时区选择 4.4 软件选择 4.5 安装位置选择 4.6 手…

M1芯片Macbook虚拟机安装centos7

目录 一、安装parallels Desktop、centos7 二、安装Parallels Tools 三、安装VNC server服务 四、进程占用问题 一、安装parallels Desktop、centos7 由于centon7内核版本问题用PD18等版本安装centos7进入默认是命令行安装。 命令界面安装: 1、选数字5 回车 再…

虚拟机安装centos7

1、简介 这里虚拟机采用VMware15.1.0,镜像采用CentOS7版本,官网或国内镜像可直接下载。 https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 2、安装流程 1、打开vmware软件,点击 创建新的虚拟机。 2、选择 典…

Mac(2) Parallels Desktop 安装 CentOS7

文章目录 一、前言二、准备三、Parallels Desktop安装CentOS7四、CentOS7配置1、网络配置 -- 设置固定ip2、关闭防火墙3、关闭SELinux4、更新yum源5、安装ifconfig6、其它 一、前言 本文将通过Parallels Desktop安装CentOS7 二、准备 Parallels Desktop下载安装 https://www…

vm安装centos7蓝屏

vm安装centos7蓝屏 最近有同学购买了最新款英特尔11代的笔记本,使用vm安装centos7系统,一启动虚拟机就系统蓝屏,今天给后来的同学们找一下坑吧。 系统:最新版win10 软件:vm16.0 链接:【百度云】 提取码&am…

Docker 安装 CentOS7

Docker 安装 CentOS 前言一、查看可用的 CentOS 版本二、安装1、拉取指定版本的 CentOS 镜像,这里我们安装指定版本为例(centos7):2、查看本地镜像,验证是否安装成功2、运行容器3、进入到Centos容器4.安装ssh服务和网络必须软件A、安装完后重启SSH服务:B…

Mac M1安装Centos7

一、安装PD虚拟机 地址:https://macwk.com/soft/parallels-desktop-for-arm 二、下载centos (arm64)镜像 地址:https://www.aliyundrive.com/s/ZGVA2Mfkm2q 提取码: 4b9d **注意:**因网盘分享文件类型限制,这里下载镜像后需要把…

图解VirtualBox安装CentOS 7

VirtualBox简介 VirtualBox是由德国InnoTek软件公司出品的虚拟机软件,现在则由甲骨文公司进行开发,是甲骨文公司xVM虚拟化平台技术的一部分。 VirtualBox提供用户在32位或64位的Windows、Solaris及Linux 操作系统上虚拟其它x86的操作系统。用户可以在V…

CentOS 7系统安装配置图解教程

操作系统:CentOS 7.3 备注: CentOS 7.x系列只有64位系统,没有32位。生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 一、安装CentOS 7.3 成功引导系统后,会出现下面的界面 界面说明: Install CentOS 7 #安装…

CentOS7系统安装步骤详解

前言 CentOS7各版本系统安装过程基本一致,本文使用CentOS7.5镜像进行系统安装,希望对广大读者有所帮助! 一、虚拟机软件 常用的虚拟机软件:windows系统常用VMware workstation、Virtual box等软件,macOS系统建议使用…