首页 > 解决方案 > 按子句和列表分组

问题描述

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 的表,其中包含以下字段:

我将查询写为:

select sum(student_marks) from student
group by student_branch;

所以根据段落,我按 student_branch 对行进行分组。那么创建什么组呢?是否有一个包含所有 student_branch 值的组?我也无法理解这句话“(所有其他行都放在该组的列表中)的含义。

谁能解释一下 group by 实际是如何工作的,然后聚合函数是如何在这些组上工作的。

标签: mysqlsqldatabase

解决方案


在您的示例中,您将为 column 中的每个不同值设置一个单独的组student_branch。因此,如果您有student_branch = A5 名学生和student_branch = B3 名学生,那么您将获得 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子句,因此它将按学生分支对整个表的记录进行分组。


推荐阅读