groupby 的原理及使用场景

一直用不好groupby,只记得groupby的时候不能select其他字段(非groupby的字段),但是也看到有些函数如count()可以和groupby一起用。有点理不清宁不过来怎么用,今天查找资料学习整理了一下,希望可以记住。:(

定义:

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

聚合函数: 

示例:统计1号,2号每个Customer购买的产品总价。

sql语句实现为: select sum(ProdctPrice) from table where (OrderDate = '2020/6/1' or OrderDate = '2020/6/2') group by CustomerID

实现过程解析:

group by CustomerID,那么找CustomerID那一列,将具有相同CustomerID值的行,合并成一行且去重,只留一个值。

对应的其他列的值,会将其他列的值合并整合到一行里,不做任何过滤处理。

如对于CustomerID值为A,group by 后,CustomerID值相同为A的三行合并成一行,CustomerID值为A,该行对应的其他列的值是其他列所有CustomerID值相同为A的值的汇总,如OrderID的值有三个。

这就是为什么select的时候不能加其他字段,但是可以使用聚合函数了。
1)如果执行select *的话,那么返回的结果就包括灰色隐藏部分的含有多个值得列,如OrderID和ProductN等中有的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以你看,执行select * 语句就报错了。

2)而CustomerID列,每个单元格只有一个数据,所以我们select CustomerID的话,就没有问题了。CustomerID列只有一个值呢,是因为用CustomerID列来group by的。

3)对于有多个数据的列依然可以过滤使用,就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(),sum(),而每个聚合函数的输入就是每列含有多数据的值。

聚合函数参加上图。

你可能感兴趣的:(groupby 的原理及使用场景)