分组聚合
分组聚合
使用分组可以将数据分为多个逻辑组,然后对每个组进行聚合计算。
创建分组
分组是使用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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦