分组
GROUP BY 语句
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
案例实操:
计算每个学生的平均分数
select s_id ,avg(s_score) from score group by s_id;
计算每个学生最高成绩
select s_id ,max(s_score) from score group by s_id;
HAVING 语句
1. having与where不同点
1. where针对表中的列发挥作用,查询数据;having针对查询结果中的列发挥作用,筛选数据。
2. where后面不能写分组函数,而having后面可以使用分组函数。
3. having只用于group by分组统计语句。
2. 案例实操:
求每个学生的平均分数
select s_id ,avg(s_score) from score group by s_id;
求每个学生平均分数大于85的人
select s_id ,avg(s_score) avgscore from score group by s_id having avgscore > 85;
JOIN 语句
等值 JOIN
Hive支持通常的SQL JOIN语句,但是只支持等值连接,不支持非等值连接。
案例操作: 查询分数对应的姓名
SELECT s.s_id,s.s_score,stu.s_name,stu.s_birth FROM score s LEFT JOIN student stu ON s.s_id = stu.s_
表的别名
好处
使用别名可以简化查询。
使用表名前缀可以提高执行效率。
案例实操
合并老师与课程表
select * from techer t join course c on t.t_id = c.t_id;
内连接
内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
select * from techer t inner join course c on t.t_id = c.t_id;
左外连接
左外连接:JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。
查询老师对应的课程
select * from techer t left join course c on t.t_id = c.t_id;
右外连接
右外连接:JOIN操作符右边表中符合WHERE子句的所有记录将会被返
select * from teacher t right join course c on t.t_id = c.t_id;
多表连接
注意:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。
多表连接查询,查询老师对应的课程,以及对应的分数,对应的学生
select * from teacher t
left join course c
on t.t_id = c.t_id
left join score s
on s.c_id = c.c_id
left join student stu
on s.s_id = stu.s_id;
大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表techer和表course进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表score;进行连接操作。