本文通过案例进行讲解
假设数据库有一个名为students_grade的表:
计算所有学生各个学科在2019年的平均分,筛选出平均分超过60分的记录,并且最后以平均分进行降序排列。
-
代码示例:
1、关键字的执行顺序
from -> where -> group by -> select -> having -> order by
-
关键字的执行顺序并不是完全按照代码中书写的顺序来执行的
2、from
-
from,后面跟着原表,最终的结果表是基于该表进行加工得到的
-
案例中,原表是students_grade,其全名是由库名和表名两部分组成的,用“.”连接,如dw.students_grade
-
所以在表名中使用“_”进行连接,而不用".",避免引起歧义
3.where
-
where,表示在计算前对原表的记录进行筛选
-
Hive中大部分表示分区表,使用分区字段可以加快查询速度
-
对于分区表,where条件是不可或缺的,一定要在where条件中选择分区范围
4.group by
-
group by,用于分组,确定后面聚合计算的范围
-
案例中要计算同一个学生、同一个学科的平均分,因此使用group by id,name,subject
-
对于简单的不需要进行分组计算的查询,可以不使用group by
5.select
-
在from、where、group by语句都执行完成后,才会开始执行select语句
-
select后面的是最终会出现在结果表的字段
-
select后的字段包括两部分:用于分组的字段和利用聚合函数计算出的字段
6.group by
-
在group by语句存在的情况下,select后的所有非聚合字段都会被视为分组字段,需要在group by语句中出现,否则就会报错
-
在group by后出现的分组字段,不在select语句中出现,不会报错,但是会引起歧义
-
需要保证select后的非聚合字段和group by后的分组字段一一对应
7.as
-
在select语句中可以使用as为所有字段重命名,称为字段别名
-
通过聚合计算得到的字段,这一步是不可或缺的,否则会给出默认的没有任何含义的字段名
-
由于group by语句是在select语句前执行的,因此select语句中不可以出现字段别名
8.having
-
只有存在group by语句时才会使用having,没有group by语句而只有having会报错
-
having主要用于对聚合计算后的字段进行筛选
-
having语句在select语句之后执行,可以使用字段别名
9.order by
-
用于排序
-
基于一列进行排序的语法格式:"order by 字段名 asc/desc"
-
asc表示升序排列,desc表示降序排列
-
基于多列排序的语法格式:"order by c1 asc, c2 desc,c3 asc"
-
order语句在select语句之后执行,可以使用字段别名
参考文献
1.《拿下Offer 数据分析师求职面试指南》徐麟 著