开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段):网站流量日志分析--统计分析--sql补充扩展--group by 语法限制解析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/696/detail/12229
网站流量日志分析--统计分析--sql补充扩展--group by 语法限制解析
1、group by
group by 字段有两个要求,出现在表达式中字段要么是分组的字段,要么是被聚合函数包围应用的字段。
2、表有两个字段,一个是姓名,一个是城市。表名字是 t_user(name,city)。
name |
city |
allen |
beijing |
tom |
shanghai |
kobe |
beijing |
james |
beijing |
anna |
shanghai |
3、需求,统计每个城市的人有多少?
select count (name) from t_ user group by city;
确定关键字,统计
sql 执行时,底层是根据城市分组,北京是一个分组,上海来自于另外一个分组。
allen |
beijing |
kobe |
beijing |
james |
beijing |
tom |
shanghai |
anna |
shanghai |
count 表达式应用于各个组内,针对于第一组反回3条记录,针对于第二组返回2条记录,最终反馈两个数字,一个是3,一个是2,三个人和两个人分别是哪个城市,city 是分组的字段,不会报错。
Select city, count (name) from t_user group by city;
出现在表达式中字段要么是分组的字段,要么是被聚合函数作用包围的字段。
allen |
beijing |
kobe |
beijing |
james |
beijing |
tom |
shanghai |
anna |
shanghai |
还是分为两组,把 city, count (name) 表达式应用每个分组中,不会出现歧义,返回的结果是 beijing3,shanghai2,显示人数和 city 名。
4、需求,还想看一下每个城市的具体的人是谁,叫什么名字。
Select
name
, count (name) from t_user group by city;
如果输入 name,就会报非法引用的错误,name 引用不合法。
把数据分为两个组,每个组内得到三个表达式。不能将 name 字段多个聚在一起写,name 不是分组字段就会发生歧义。如果是分组字段,相同的才会来到同一分组,根据 city 分组,是北京的才会进入一个组,根据名字分组,不是相同的名字属于不同的组,消除歧义,聚合函数指的是输入多行输出一行的函数,不管输入几行,被聚合函数应用完之后输出一行就可以消除歧义,比如针对 name 做 count 统计,不管有几行,用聚合函数就会返回一行,也可以消除歧义,不可能在一个表达式中出现不同的结果,在 name 中显示不同的东西,这是歧义,因此 group by 才有这样的语法规则,要不然把它放在分组中保证分组一样,要不然被聚合函数应用,是否放在分组中要结合具体的环境具体的业务确定它的出现是否会改变分组的结果,这就是 group by 的限制和具体的解释。