Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre

select A
from 表
group by B;

mysql报错:
Expression #1 of SELECT list is not in GROUP BY clause and contains
nonaggregated column ‘…’ which is not functionally
dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by

翻译过来就是select选择出来的列不在group by后面也不依赖于group by列的功能。这与sql_mode=only_full_group_by不兼容。

其实是因为出现了错误查询。
如果语句中有group by子句,那么select后面就必须是group by后面的属性或者是 某聚集函数(group by后面没有的属性)【例如avg(),max(),min()…】

下面的例子才是正确的。

select A,avg(B)
from 表
group by A;

但是因为之前不清楚,所以按照下面的方法硬生生的使得这个错误语句能成功查询。

下面是官方MySQL 5.7参考手册中关于ONLY_FULL_GROUP_BY的解释。https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre_第1张图片
翻译下就是

拒绝select列表、HAVING条件或ORDER BY列表引用非聚合列的查询,这些列既不在GROUP BY子句中命名,也不依赖于GROUP BY列的功能(由GROUP BY列唯一确定)。
从MySQL5.7.5开始,默认的SQL模式包括ONLY_FULL_GROUP_BY。(在5.7.5之前,MySQL没有检测到函数依赖,默认情况下也没有启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为,请参阅MySQL 5.6参考手册。 )
标准SQL的MySQL扩展允许在HAVING子句中引用select列表中的别名表达式。在MySQL 5.7.5之前,启用ONLY_FULL_GROUP_BY将禁用此扩展,因此需要使用无别名表达式编写HAVING子句。从MySQL 5.7.5开始,这个限制被取消了,因此HAVING子句可以引用别名,而不管是否启用了ONLY_FULL_GROUP_BY。
有关更多的讨论和示例,请参见12.20.3节,“MySQL对GROUP BY的处理”。

我们可以在Navicat Premium 15中输入(命令行或者别的MySQL管理软件也都可以)下列语句,以此来查看默认的SQL模式。

select @@sql_mode

可见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

解决办法:
一、永久方法
修改my.ini(Windows中MySQL配置文件)
在里面添加

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关闭)
然后将文件保存为ANSI编码格式。

因为my.ini 是静态文件,与服务是否在运行没什么关系。所以说可以不必先 stop 服务再修改 my.ini。

不过修改了配置文件之后,发现MySQL服务一直无法启动,试了好几种方法都没能解决,只好将配置文件还原(还原之后MySQL服务便可成功启动),选择临时办法。

二、临时办法
MySQL服务关闭后就会失效,所以每次启动MySQL服务就要在Navicat中输入下列语句,然后点击运行。

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

P.S.
MySQL服务的启动与关闭:以管理员的身份运行cmd,将目录切换至mysql安装目录的bin目录下
net start mysql //启动
net stop mysql //关闭

你可能感兴趣的:(软件使用)