mysql5.6和mysql5.7,X在group by上的区别

首先:表

聚合语句:

mysql>   select country,SUM(fee) as tot from member group by country;
+---------+-------+
| country | tot   |
+---------+-------+
| china   | 19700 |
| UK      | 7000  |
| US      | 5000  |
+---------+-------+
3 rows in set (0.08 sec)
 

这条语句是正确的不会报错(5.6 5.7都不会)

 

区别:

1.mysql 5.6

mysql>   select country,SUM(fee),name as tot from member group by country;
+---------+----------+--------+
| country | SUM(fee) | tot    |
+---------+----------+--------+
| china   | 19700    | 刘不二 |
| UK      | 7000     | jack   |
| US      | 5000     | Tom    |
+---------+----------+--------+
3 rows in set (0.07 sec)

 

2.mysql 5.7

mysql> select country,SUM(fee),name as tot from member group by country;
1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mysql.member.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

 

我们查看sql_mode

01

select @@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

 

通俗解释:

当加入一个name时,5.6不会报错但是5.7会,因为一个国家里面有很多不同的name字段,你到底想展示哪一个呢?5.7不知道 

,但是5.6会默认第一个。

 

解决办法:

修改my.cnf(windows下是my.ini)配置文件,删掉only_full_group_by这一项

若我们项目的mysql安装在ubuntu上面,找到这个文件打开一看,里面并没有sql_mode这一配置项,想删都没得删。

当然,还有别的办法,打开mysql命令行,执行命令

1

select @@sql_mode;

这样就可以查出sql_mode的值,复制这个值,在my.cnf中添加配置项(把查询到的值删掉only_full_group_by这个选项,其他的都复制过去):

1

sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;

如果 [mysqld] 这行被注释掉的话记得要打开注释。然后重重启mysql服务

注:使用命令

1

set sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

这样可以修改一个会话中的配置项,在其他会话中是不生效的。  

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值