MySQL之[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause问题

问题提出

MySQL数据表查询语句:

select * from t_user where sex = 0 group by home_address having count(id)>0;

提示如下错误信息:

[42000][1055] Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'spb-db.t_user.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

t_user表的定义如下:

create table t_user
(
   id           bigint auto_increment  primary key,
   created_by   varchar(255) null,
   created_time datetime     null,
   updated_by   varchar(255) null,
   updated_time datetime     null,
   version      bigint       null,
   age          int          null,
   home_address varchar(255) null,
   name         varchar(255) not null,
   phone        varchar(255) null,
   sex          int          null,
   birth_day    date         null,
   constraint my_index_name
       unique (name)
)

MySQL信息

在MySQL命令行或者控制台输入指令:

select @@version

输出: 8.0.19

select @@global.sql_mode

输出:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

原因分析:
MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表。
参考文档: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-setting
在文档指出:ONLY_FULL_GROUP_BY的设定,将不允许查询字段包括非聚集列。
5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启ONLY_FULL_GROUP_BY.

only_full_group_by

only_full_group_by:select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其实这个配置和distinct差不多的.
例如在默认开启only_full_group_by设置下:

select home_address, count(id) from t_user where sex = 0 group by home_address having count(id)>0;

其中home_address为group 分组中的column。 id使用了聚集函数count,所以它们是有效的。

关闭这个设置

在MySQL命令行或控制台执行指令:

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

检查一下是否设置成功:

select @@global.sql_mode

看看ONLY_FULL_GROUP_BY是否消失。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章