MySQL 8.0里GROUP BY有变化,注意了

MySQL8.0中Group By行为改变,不再默认排序,与前版本结果可能不同。文章对比了5.7和8.0版本下Group By的表现,强调8.0及以后版本需显式使用Order By来保证结果的一致性和预期性。

如题所示,MySQL 8.0开始 group by 默认是没有排序的,那MySQL 8.0之前和 8.0 就有可能结果出现不同 需要警惕

5ac6597c924ad996e4e99772be16520341ca3bc6

运行如下SQL:

a7dc425dad2f51b7428141ca7e195941cefdd09a

下面是8.0 版本:

ad1b4db9915af2e5f26290538b773e14ee81a3c0

运行相同的SQL:

1e070b6ef3254cc7c37deeabf26b253b8ea42da5

如果这种情况下 进行分页

5.7 版本:

833b86530f53845d1e3f7558be30b66d10791654

8.0版本:

2ba911ee2aa24b76b34d9036094d37412a152db8

由上可见,两个结果是不一样的,原因是:8.0之前,group by 包含using filesort,而8.0开始是没有的,为了避免这种问题,8.0开始除了索引替换排序的优化思路之外的相关排序,我们都必须使用order by来进行。

59d4fbe6b7940f932cd03a45f3eca00be6ba23eb


原文发布时间为:2018-11-28
本文作者:松华老师
本文来自云栖社区合作伙伴“ 老叶茶馆”,了解相关信息可以关注“ 老叶茶馆”。
### MySQL 8.0 中 `GROUP BY` 的用法 在 MySQL 8.0 及更高版本中,`GROUP BY` 子句用于汇总数据并返回分组后的统计信息。此子句通常与聚合函数一起使用,如 `COUNT()`、`SUM()`、`AVG()` 等。 #### 基本语法 ```sql SELECT column1, aggregate_function(column2) FROM table_name WHERE condition GROUP BY column1; ``` #### 使用示例 ##### 示例 1: 计算每个部门的员工数量 假设有一个名为 `employees` 的表,其中包含字段 `department_id` 和其他员工信息。要计算每个部门中的员工人数: ```sql SELECT department_id, COUNT(*) AS employee_count FROM employees GROUP BY department_id; ``` 这会返回每种 `department_id` 对应的员工总数[^3]。 ##### 示例 2: 获取各部门薪资总和 如果想要了解各个部门内所有员工工资总额,则可以执行如下查询语句: ```sql SELECT department_id, SUM(salary) as total_salary FROM employees GROUP BY department_id; ``` 上述命令将给出按部门划分的薪水累积值。 #### 结合 HAVING 进行过滤 有时可能希望基于某些条件来筛选特定的结果集,在这种情况下就可以利用 `HAVING` 关键字配合 `GROUP BY` 来实现更复杂的逻辑判断。 例如,找出拥有超过五名成员以上的团队及其平均年龄: ```sql SELECT team_name, AVG(age), COUNT(*) FROM teams GROUP BY team_name HAVING COUNT(*) > 5; ``` 这段 SQL 将展示那些至少有六位队员参与的队伍名称以及它们各自的平均年龄。 #### 排序结果 为了使最终输出更加直观易读,还可以添加 `ORDER BY` 子句对所得记录按照指定列进行升序 (ASC) 或降序 (DESC) 安排顺序。 比如获取销售量最高的前三类产品类别,并按销量高低排列显示: ```sql SELECT category, SUM(quantity_sold) as sales_volume FROM products_sales GROUP BY category ORDER BY sales_volume DESC LIMIT 3; ``` 该指令先依据商品种类做分类求和运算再依数值大小逆向排序最后仅保留排名最前三位的数据项呈现给用户查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值