浅谈mysql的sql_mode可能会限制你的查询

2025-03-28 16:50

本文主要是介绍浅谈mysql的sql_mode可能会限制你的查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则...

场景:

现在我们常用数据库有哪些?一想到的就是mysql,oracle吧,今天说的是mysql中我们写sql语句时候常见的一个问题,相信挺多朋友在执行一些复杂的分组查询的时候,都会遇到一个查询错误,大佬们自然不存在了,但相信小猿们还是会碰到的;

错误内容大致为:

Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated 
column '某列字段' which is not functionally dependent on columns in GROUP BY clause; 
this is incompatible with sql_mode=only_full_group_by

问题描述

这个问题主要说明的是,我们写的sql查询语句违背了聚合函数group by的规则,他要求SELECT列表中的所有列都必须是聚合函数的参数或者包含在GROUP BY子句中python;简单的说,也就是select后的字段列,和group by 之后的字段列没有对应上。

原因分析:

提示:为什么会出现这个问题呢?我们会好奇,好像以前执行这个类似的查询的时候没有这种限制啊,问题就在于mysql的sql_mode变量的设置有关;但是这个只针对5.7版本之后的mysql,若大家还在用早期的mysql的话,不会有这个问题,这个是后面版本加的强制规范模式;

什么是sql_mode,sql_mode 是一个用于控制 MySQL 服务器操作模式的系统变量。它允许用户定义 SQL 语言语法、数据校验和存储android引擎行为的一些规则。通过设置不同的 sql_mode 值,你可以定制 MySQL 服务器的行为,以符合特定的 SQL 标准、增强数据完整性或满足特定的应用需求

解决方案:

问题找到了,我们就来验证一下是不是sql_mode的设置有问题;

查询mysql的sql_mode变量值

// 在navicat中,查询语句输入
// 没有navica编程t的也可以直接DOS进入命令行登录mysql后,输入语句也是一样的
select @@global.sql_mode

浅谈mysql的sql_mode可能会限制你的查询

在结果中,我们可以看到有ONLY_FULL_GROUP_BY的内容,说明在数据库中我们设置了该语法的强制校验规则,所以导致我们的查询不通过。因此,我们只要将这个值去掉即可;
修改该变量值通常的做法有两个方式:

第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

//  set global sql_mode = 'select @@global.sql_mode 得到返回值中,去掉group by 限制'

set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

浅谈mysql的sql_mode可能会限制你的查询

第二种:需要修改mysql的配置文件;但是效果则是永久的;

我们只要找到我们的China编程mysql配置文件即可,打开在【mysqld】下加上一句话;
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION设置后需要重启mysql服务才会生效;

这里需要注意的是,若是Windows系统,配置文件找到my.ini修改即可,但若是跟博主一样的MAC电脑,则是找到my.cnf,有时候可能也叫(mysql-deafault.cnf)甚至有的版本并不会生成这个配置文件,需要我们自行生成,具体根据安装mysql的方式有关系,你用homebrew和正常dmg安装的就不一样,所以这块一定要注意别找错配置文件,不然配置就不会生效

不得不吐槽一下mac电脑,已经很难了,如果你还是macos加个M1,M2芯片,那对味了,看一眼就爆炸

到此这篇关于浅谈mysql的sql_mode可能会限制你的查询的文章就介绍到这了,更多相关mysql sql_mode查询内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.cphpppcns.com)!

这篇关于浅谈mysql的sql_mode可能会限制你的查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153994

相关文章

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清