1. 程式人生 > >mysql Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause

mysql Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause

mysql使用group by 報錯:

Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'XXX.Y.ZZZZ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

原因:
      MySQL 5.7.5和up實現了對功能依賴的檢測。如果啟用了only_full_group_by SQL模式(在預設情況下是這樣),那麼MySQL就會拒絕選擇列表、條件或順序列表引用的查詢,這些查詢將引用組中未命名的非聚合列,而不是在功能上依賴於它們。(在5.7.5之前,MySQL沒有檢測到功能依賴項,only_full_group_by在預設情況下是不啟用的。關於前5.7.5行為的描述,請參閱MySQL 5.6參考手冊。)

執行以下個命令,可以檢視 sql_mode 的內容。

  mysql> SHOW SESSION VARIABLES;

  
  mysql> SHOW GLOBAL VARIABLES;

  mysql> select @@sql_mode;


可見session和global 的sql_mode的值都為: 

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

only_full_group_by說明: 
only_full_group_by :使用這個就是使用和oracle一樣的group 規則, select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其實這個配置目前個人感覺和distinct差不多的,所以去掉就好 
官網摘抄: 
官網:ONLY_FULL_GROUP_BY 
Reject queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on (uniquely determined by) GROUP BY columns.

As of MySQL 5.7.5, the default SQL mode includes ONLY_FULL_GROUP_BY. (Before 5.7.5, MySQL does not detect functional dependency and ONLY_FULL_GROUP_BY is not enabled by default. For a description of pre-5.7.5 behavior, see the MySQL 5.6 Reference Manual.)

A MySQL extension to standard SQL permits references in the HAVING clause to aliased expressions in the select list. Before MySQL 5.7.5, enabling ONLY_FULL_GROUP_BY disables this extension, thus requiring the HAVING clause to be written using unaliased expressions. As of MySQL 5.7.5, this restriction is lifted so that the HAVING clause can refer to aliases regardless of whether ONLY_FULL_GROUP_BY is enabled.

解決:
執行以下兩個命令:

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

mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

這兩個命令,去掉 sql_mode 的 ONLY_FULL_GROUP_BY

見其他文章有說: 
直接修改mysql配置檔案(我的系統是Ubuntu16.04的,在/etc/mysql/mysql.conf.d/mysqld.cnf 中並沒有sql_mode這個配置,所以直接加上就好,如果是其他系統有得修改就不用添加了) 
這個方法暫時沒有式。

mysql 配置資訊讀取順序。

①ps aux|grep mysql|grep ‘my.cnf’

②mysql –help|grep ‘my.cnf’

/etc/my.cnf, /etc/mysql/my.cnf, /usr/local/etc/my.cnf, ~/.my.cnf這些就是mysql預設會搜尋my.cnf的目錄,順序排前的優先。mysql按照上面的順序載入配置檔案,後面的配置項會覆蓋前面的。

如果沒有該檔案可以自定義一個檔案。然後回預設讀取配置中的內容) 
檢視你需要修改的是哪個配置檔案。我只有/etc/my.cnf 只修改這個檔案即可

配置檔案my.cnf通常會分成好幾部分,如[client],[mysqld], [mysql]等等。MySQL程式通常是讀取與它同名的分段部分,例如伺服器mysqld通常讀取[mysqld]分段下的相關配置項。如果配置項位置不正確,該配置是不會生效的

參考:https://stackoverflow.com/questions/37951742/1055-expression-of-select-list-is-not-in-group-by-clause-and-contains-nonaggr

這個語句沒試過,先記錄:(標識:能用->重啟伺服器之後,失敗)

[email protected]@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

去掉ONLY_FULL_GROUP_BY即可正常執行sql.

經典常用方法(更改配置)

vim /etc/my.cnf

新增

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

 

 

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

原文地址https://blog.csdn.net/qq_24038207/article/details/79358644