【MySQL】MySQL Group By强制问题

在MySQL中,GROUP BY强制模式是一种设置,它可以使GROUP BY语句更加严格,以避免潜在的错误或不一致性。在GROUP BY强制模式下,如果SELECT语句中的列名不在GROUP BY子句中,MySQL将会抛出错误

1、以下是在MySQL中启用GROUP BY强制模式的步骤

  • 1、登录MySQL数据库服务器
  • 2、执行以下命令查看当前的sql_mode设置
SELECT @@sql_mode;
  • 3、 如果sql_mode设置中没有ONLY_FULL_GROUP_BY,那么需要将其添加到sql_mode中,以启用GROUP BY强制模式。执行以下命令
SET GLOBAL sql_mode = CONCAT(@@sql_mode, ',ONLY_FULL_GROUP_BY');

这里的ONLY_FULL_GROUP_BY是启用GROUP BY强制模式的选项之一

  • 4、重新执行第2步的命令,确认sql_mode已经被成功设置为启用GROUP BY强制模式

注意:启用GROUP BY强制模式可能会导致一些旧的SQL语句无法正常执行,因此在设置前需要确认所有的SQL语句都能够适应这种模式;GROUP BY强制模式要求MySQL版本不低于5.7.5,如果MySQL版本过低,就无法启用GROUP BY强制模式

  • 5、使用SET GLOBAL命令设置sql_mode参数是临时生效的

在MySQL中,使用SET GLOBAL命令设置sql_mode参数是临时生效的,如果您重启了MySQL服务器,该设置将会失效,需要重新设置

2、永久修改sql_mode参数

如果您希望永久修改sql_mode参数,可以在MySQL配置文件中进行修改,具体步骤如下:

  1. 打开MySQL配置文件,一般位于/etc/my.cnf/etc/mysql/my.cnf目录下
  2. 找到[mysqld]部分,如果没有则自行添加
  3. [mysqld]部分中添加以下行
sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

这里的参数值是一个逗号分隔的字符串,包含了需要启用的所有sql_mode选项。

保存并关闭MySQL配置文件。

重启MySQL服务器,使修改生效。

这样,您就可以永久修改sql_mode参数,使之生效。

特别说明

SELECT NAME FROM TABLE GROUP BY ID

在MySQL强制模式下,如果SELECT语句中出现的列不在GROUP BY子句中,如果id是表的主键,那么每个id只会对应一个name值,因此MySQL不会报错。但是,这种查询语句的结果可能不是您所期望的,所以,如果您希望得到按照特定顺序返回的结果,最好将所有出现在SELECT语句中的列都包含在GROUP BY子句中。

SELECT ROOM_ID,COUNT(EQUIP_ID) FROM T_SYS_LINE WHERE ROOM_ID = 1 AND DELETE_FLAG = '1' 

这个查询语句中,GROUP BY子句确实缺少一个列,即COUNT(EQUIP_ID)。按照MySQL的规则,在强制模式下,如果SELECT语句中出现的列不在GROUP BY子句中,MySQL会报错。但是,在某些情况下,MySQL会自动将缺少的列添加到GROUP BY子句中。这种情况下,查询语句就不会报错。这可能是因为MySQL检测到只有一个WHERE子句中的ROOM_ID作为分组依据,因此自动将COUNT(EQUIP_ID)添加到GROUP BY子句中。虽然这个查询语句在强制模式下没有报错,但是最好还是将所有出现在SELECT语句中的列都包含在GROUP BY子句中,以确保结果的正确性

你可能感兴趣的:(运维专线,mysql,数据库,服务器)