作用:group by可以把数据划分为若干个组
用法:group by后接进行分组的依据
group by和distinct进行去重的异同:
distinct:进行两两对比,需要遍历整个表
group by:进行查询前先按照分组属性进行分组,再进行查询
不管是进行单列去重还是多列去重,两者返回的结果都是一样的
但是当数据量比较大时,使用group by的速度要优于distinct
为什么使用group by时不能select *?
举例说明:s表
id | name | score |
1 | ming | 80 |
2 | ming | 95 |
3 | ale | 70 |
4 | ale | 98 |
5 | gala | 100 |
select *
from s
group by name
执行失败
select name
from s
group by name
执行成功
原因:当我们进行查询时,有group by出现,后台会先进行去重,生成了一个虚拟的表,表中多个name变成一个name,而一个单元格中会出现多个分数 just like
id | name | score |
1 2 | ming | 80 95 |
3 4 | ale | 70 98 |
此时进行查询*,一个单元格中出现多个数据,这是关系型数据库所不允许的,所以结果报错
当我们查询name时可以正常输出,因为name列中,每个单元格始终只有一个数值
so 如何解决?
答案是聚集函数just like:avg,sum,min,max,count
select name,avg(score)as ‘平均分’
from s
group by name