为了账号安全,请及时绑定邮箱和手机立即绑定

分组聚合

分组聚合

使用分组可以将数据分为多个逻辑组,然后对每个组进行聚合计算。

创建分组

分组是使用SELECT语句的GROUP BY子句建立的。

Students表:

| id  | class_id | name | gender | score |
| --- | -------- | ---- | ------ | ----- |
| 1   | 1        | 小明 | M      | 90    |
| 2   | 1        | 小红 | F      | 95    |
| 3   | 1        | 小军 | M      | 88    |
| 4   | 1        | 小米 | F      | 73    |
| 5   | 2        | 小白 | F      | 81    |
| 6   | 2        | 小兵 | M      | 55    |
| 7   | 2        | 小林 | M      | 85    |
| 8   | 3        | 小新 | F      | 91    |
| 9   | 3        | 小王 | M      | 89    |
| 10  | 3        | 小丽 | F      | 88    |
SELECT gender,COUNT(*) AS total FROM Students GROUP BY gender;

| gender | total |
| ------ | ----- |
|   M    |   5   |
|   F    |   5   |

上面的SELECT语句指定了两个列:gender和计算字段total。
GROUP BY子句指定了Students表按gender进行分组。
从输出结果中可以看到,系统根据gender将Students表自动分成两个组,然后对每个组执行聚合函数。

过滤分组

如果想排除某些分组,可以通过HAVING子句在数据分组后进行过滤。

SELECT
  class_id,
  FLOOR(AVG(score)) AS score
FROM
  students
GROUP BY
  class_id
HAVING
  FLOOR(AVG(score)) > 80;

| class_id | score |
| -------- | ----- |
|    1     |   91  |
|    3     |   89  |

从输出结果中可以看到,系统按照class_id对Students表进行分组,并计算每个class_id的平均分数,然后使用HAVING子句筛选出平均分数大于80的结果。

HAVING和WHERE

HAVING与WHERE非常类似,唯一的差别是,WHERE过滤行,而HAVING过滤分组。
如果不指定GROUP BY,则大多数数据库其实会同等对待它们,但是在使用HAVING时必须结合GROUP BY子句。
还有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。

分组和排序

在使用GROUP BY子句时,应该也给出ORDER BY子句,这是保证数据正确排序的唯一方法。

SELECT
  class_id,
  FLOOR(AVG(score)) AS score
FROM
  Students
GROUP BY
  class_id
ORDER BY
  score DESC;

| class_id | score |
| -------- | ----- |
|    3     |   89  |
|    1     |   86  |
|    2     |   73  |

SELECT子句顺序

|   子句    |       说明        | 是否必须使用 |
|----------|-----------------|--------------|
|  SELECT  | 要返回的列或表达式 |      是      |
|   FROM   | 从中检索数据的表   | 仅在从表选择数据时使用 |
|  WHERE   |     行级过滤      |      否      |
| GROUP BY |     分组说明      | 仅在按组计算聚合时使用 |
|  HAVING  |     组级过滤      |      否      |
| ORDER BY |   输出排序顺序    |      否      |
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消