MySQL 5.7版本中的GROUP BY语句发生了变化,在不加任何设置的情况下会默认开启ONLY_FULL_GROUP_BY模式。这种模式要求GROUP BY子句中出现的每个列,都必须在SELECT表达式中出现,或者是在聚合函数中使用。否则就会报1055错误,提示错误信息为“this is incompatible with sql_mode=only_full_group_by”。
如果你需要在MySQL5.7中使用GROUP BY子句但又遇到了1055错误,可以按照以下步骤,关闭ONLY_FULL_GROUP_BY模式。
步骤一:查看MySQL配置文件中是否存在sql_mode
在终端中输入以下命令:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
此命令会打开MySQL配置文件,如果你看到文件中有以下这行代码,则说明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"
步骤二:注释掉sql_mode行
在上面命令打开的文件中,找到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"
步骤三:保存文件并重新启动MySQL服务
保存文件并关闭编辑器,然后在终端中输入以下命令,重启MySQL服务。
sudo service mysql restart
完成上述步骤后,ONLY_FULL_GROUP_BY模式将被关闭。以下是两个示例。
示例一
假设我们有一张user表,其中共有4个字段:id、name、age、score。如果我们要查询每个年龄段的平均分数,则可以执行以下SQL语句:
SELECT age, AVG(score)
FROM user
GROUP BY age;
上述SQL语句在MySQL5.6及以下版本中可以正常执行,但是在MySQL5.7及以上版本中会报1055错误。此时,我们可以按照上述步骤关闭ONLY_FULL_GROUP_BY模式,或者修改SQL语句,将age字段也加入SELECT表达式中,如下所示:
SELECT age, AVG(score)
FROM user
GROUP BY age, name;
示例二
假设我们有一张orders表,其中共有4个字段:id、user_id、product_id、price。如果我们要统计每个用户的订单总金额,则可以执行以下SQL语句:
SELECT user_id, SUM(price)
FROM orders
GROUP BY user_id;
上述SQL语句在MySQL5.6及以下版本中可以正常执行,但是在MySQL5.7及以上版本中会报1055错误。此时,我们可以按照上述步骤关闭ONLY_FULL_GROUP_BY模式,或者修改SQL语句,将price字段也加入SELECT表达式中,如下所示:
SELECT user_id, SUM(price) as total_price
FROM orders
GROUP BY user_id, price;
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL5.7 group by新特性报错1055的解决办法 - Python技术站