强制ONLY_FULL_GROUP_BY的好处
为什么使用ONLY_FULL_GROUP_BY
首先,我们知道在MySQL做聚合处理时,一般的SQL代码目的无非是两个: 分组 + 统计 。
我们使用 GROUP_BY 时已经进行了分组。而统计则表示:数值的总和或数量的统计。
其次,我们在做聚合处理时,在结果集中是按照某一个字段进行分组。那如果在获取的结果集中 强制显示非聚合字段 ,那会产生什么问题呢? 是的,值的不确定性。
例子
我们说过了,在获取的结果集中 强制显示非聚合字段会造成 值的不确定性 。
说明(例子我就不写图了,可以自己手敲)
- 我们数据库存在一张订单表(Order)
id | order_name | user_id | prod_id | create_date |
---|---|---|---|---|
索引 | 订单名 | 用户id | 商品id | 创建时间 |
关闭 ONLY_FULL_GROUP_BY
- 查询数据
select count(prod_id) , create_date from order GROUP BY user_id;
最终结果: 数量统计准确, 创建时间随机
在这个查询中,create_date 列没有被列出来,也没有使用聚合函数进行聚合,但是在非ONLY_FULL_GROUP_BY模式下,这个查询也可以执行成功。这个查询将会返回每个订单的create_date 列的随机值,而不是每个订单的真实订单日期。
结论
如果从SQL模式中去掉ONLY_FULL_GROUP_BY,将允许在SELECT语句中使用没有被GROUP BY子句列出的列。这可能会导致一些列的值被随机选择,而不是被正确地聚合。