理解group by

以表1test为例:
在这里插入图片描述
如果说执行以下语句,很显然结果如下:

select name from test
group by name;

在这里插入图片描述
对于group by name ,可以这么理解,就是把相同name的数据合并到一行,比如说将(1,a,2)与(2,a,4)合并到一行即一个单元格里

在这里插入图片描述

这里,我们将生成的结果表当成表2,原始表为表1

  1. 如果执行select *的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以你看,执行select * 语句就报错了
  2. 我们再看name列,每个单元格只有一个数据,所以我们select
    name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。
  3. 那么对于id和number里面的单元格有多个数据的情况怎么办呢?答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。

针对selec * 的问题我做了个测试

select name from employee
group by name;

在这里插入图片描述
如果执行以下语句
正常来说,应该显示所有数据,可是一个name 对应多个值,可是别的字段不知道怎么输出

select * from employee
group by name;

在这里插入图片描述
针对多个数据的情况,就是使用聚合函数,这样多个输入数据,输出一个数据,例如针对表1,group by name,可以使用sum对number进行聚合,将重复的数据聚合在一起

在这里插入图片描述

group by多字段,比如:group by name,number,可以把name、number当成一个整体字段,

在这里插入图片描述
如果说group by之后想筛选可以用where吗?
select product,sum(price) from orders where sum(price) GROUP BY product
事实是错误的
where后面不能接聚合函数,因为聚合函数是针对结果集进行的,但是where条件并不是在查询出结果集之后运行,所以主函数放在where语句中,会出现错误,那就只能用having
select product,sum(price) from orders GROUP BY product HAVING sum(price)>100

##可以参考这位大佬的博客,讲解的很好,很多参考别人的理解
https://blog.csdn.net/sinat_40692412/article/details/81200133?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值