问题提出
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是否消失。