开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段):网站流量日志分析--统计分析--sql 补充扩展--如何编写 hive sql】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/696/detail/12228
网站流量日志分析--统计分析--sql 补充扩展--如何编写 hive sql
1、学习如何编 hive sql 语句,以及看到别人写的 sql 语句如何把握重点和关键点。针对大数据分析,查询的本质或者分析的本质落到 sql 层面就是 select,因此以select 查询语句为例如何查询编写 sql。
2、在查询中有 group by,having,where,limit 等字段在什么时间出现,查询语句的关键字 select,当找到 select 之后 from 关键字很重要,直接影响接下来操作的是什么,因为 from 后跟的是一个表,如果这个表存在,这个表不存在各种不同的结果。
Select
count(*) as nums
每个性别的人数
From
t
_user_t
用户表,为了方便起别名
--需求:统计来自于北京男女各有多少人(性別为空的排除)并且按照人数的倒数迸行排序。
3、表是全国的用户表,有北京,上海,浙江,河南,安徽,要求只来自于北京的,在操作之前进行过滤,过滤只要求北京的。
Select
count(*) as nums
From
t
_user_t
where t.city = "beijing'
分组前过滤,只要北京
4、这是个不规律的表,当中性别字段有男有女,但是在进行人口统计时性别是丢失的字段。性别可能存在空,需要把性别为空的排除掉。And
is not nu
ll
,从性别上考虑没有问题,从性能上考虑当把性别过滤放在where中意味把全国所有的性别为空都排除掉了,只需要排除北京的性别为空,所以就不能写在 where 中,where 和 having 的区别,一个是分组前全局过滤,一个是分组后过滤,就是过滤的范围不一样。
Select
count(*) as nums
From
t
_user_t
where t.city = "beijing'
group by t.sex
having t.sex is not nu
ll
5、按照人数的倒数进行排序,人数就是统计的 nums,可以编写 sql 了。
Select
count(*) as nums
From
t
_user_t
where t.city = "beijing'
group by t.sex
having t.sex is not nu
ll
order by nums desc;
6、如果返回的数据有限制,返回 n 条。
Select
count(*) as nums
From
t
_user_t
where t.city = "beijing'
group by t.sex
having t.sex is not nu
ll
order by nums desc;
l
imit n;
这是编写查询语句的 sql,或者是看别人 sql 的标准套路。
7、小结
如何編写査看 select 语句。
Select
count(*) as nums
From
t
_user_t
where t.city = "beijing'
group by t.sex
having t.sex is not nu
ll
order by nums desc;
l
imit n;
重点: select 确定之后,立马寻找 from 关键字,因为 from 后面跟的就是操作的表。返回字段,count 字段,没有这个表就是白写。先确定表,再根据业务确定表达式。
--表可能是真实存在的表,如果是真实的表,直接操作使用。
--表也可能不存在,比如 t_user 表是根据两个表 join 而来的,用户信息有一个a表一个 b 表,a 和 b 表进行关联才能构成 t_user 表。设法通过查询把这个表变出来,基于这个虚拟的表再进行操作。比如 t_user 不存在假表,没有 t_user,可以通过 a 和 b 查询得到它。
from (
select
写关键字
a.*,b.*
返回 a 字段 b 字段
from a join b on a.id = b.id
where . .
.如果需要就过滤
)t
t 表不是真实存在的表,而是 a 和 b 查询变出来的表,t 表就是一个虚拟的表。
通过查询语句,把 t 表变出来,再基于 t 表进行外面的操作,from 重要的原因就在于此。
select
a.*,b.*
from a join b on a.id = b.id
where . . .
如果发现是小括号,基本上可以确定表是一个虚拟的表,查询出来的表,如果只是一个表名,那么表肯定真实的存在,不管是写 sql 还是看 sql,立马要寻找 from 关键字,当把表的内容弄清楚之后,接下来表怎么操作就是业务的问题了。
--只有表确定之后在结合业务确定查询返回的字段或者表达式。
--嵌套子查询,先执行里面的查询语句,后执行外部的查询语句。
有可能 a 表和 b 表还不存在,a 表来自于 c 和 d,b 表来自于 e 和 f,在嵌套语句里面继续嵌套,但是嵌套过多无意义。理解嵌套的思想,编写 sql 关键字的寻找以及具体的语法规则弄清楚很重要。