以表1test为例:
如果说执行以下语句,很显然结果如下:
select name from test
group by name;
对于group by name ,可以这么理解,就是把相同name的数据合并到一行,比如说将(1,a,2)与(2,a,4)合并到一行即一个单元格里
这里,我们将生成的结果表当成表2,原始表为表1
- 如果执行select *的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以你看,执行select * 语句就报错了
- 我们再看name列,每个单元格只有一个数据,所以我们select
name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。 - 那么对于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