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是否消失。

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