mysql - 按子句和列表分组
问题描述
GROUP BY:如果需要,您可以取出 WHERE 之后剩余的行并将它们放入组或存储桶中,其中每个组包含相同的 GROUP BY 表达式值(并且所有其他行都放在该组的列表中)。在 Java 中,你会得到类似的东西:
Map<String, List<Row>>
. 如果您确实指定了 GROUP BY 子句,那么您的实际行仅包含组列,不再包含现在在该列表中的剩余列。列表中的那些列仅对可以对该列表进行操作的聚合函数可见。
上述段落摘自:https ://blog.jooq.org/a-beginners-guide-to-the-true-order-of-sql-operations/
我们有一个名为 student 的表,其中包含以下字段:
- 学生卡
- 学生姓名
- 学生标记
- Student_branch
我将查询写为:
select sum(student_marks) from student
group by student_branch;
所以根据段落,我按 student_branch 对行进行分组。那么创建什么组呢?是否有一个包含所有 student_branch 值的组?我也无法理解这句话“(所有其他行都放在该组的列表中)的含义。
谁能解释一下 group by 实际是如何工作的,然后聚合函数是如何在这些组上工作的。
解决方案
在您的示例中,您将为 column 中的每个不同值设置一个单独的组student_branch
。因此,如果您有student_branch = A
5 名学生和student_branch = B
3 名学生,那么您将获得 2 组:
A
有 5 条记录B
有 3 条记录
当您使用聚合函数时,它们将对一组中的所有记录进行操作。所以SUM(student_marks)
将A组学生的所有学生成绩单独添加,B组也单独添加。
在您的示例查询中,您将获得 2 个聚合结果行,其中只有分数的总和。student_branch
如果您在SELECT
子句中包含 ,结果会更有意义,例如:
SELECT student_branch, SUM(student_marks) AS sum_of_marks FROM student
GROUP BY student_branch;
然后结果将如下所示:
student_branch | sum_of_marks |
---|---|
一个 | 15(随机数,= A 学生的总分) |
乙 | 8(随机数,= B 学生的总分) |
GROUP BY
只会对使用子句过滤数据后剩余的记录进行分组WHERE
。在您的示例情况下,没有WHERE
子句,因此它将按学生分支对整个表的记录进行分组。
推荐阅读
- python - Python函数在调用时不返回reuslt,没有输出。我究竟做错了什么
- c# - 如何从 ac# 数组中的第二项切片元素?
- c++ - 实例化变量模板时要考虑代码的哪一部分?
- xcode - 故事板视图中文档大纲过滤器的 Xcode 快捷方式是什么?
- rust - Rust 宏规则嵌套重复
- javascript - 如何跨多个页面设置暗模式主题?
- r - 如何使用函数```num_to_schoice()```?
- boto3 - AttributeError:模块'boto3'没有属性'client'
- netbeans - 在 Netbeans 11 中禁用返回光标行为
- python - 在 Pytorch 中实现 torch.optim.lr_scheduler.LambdaLR 时出错