--------------------------------------------聚合函数
--查询每个学员学生的年龄总和,最大值 最小值 平均值
SELECT SUM(age), MAX(age), MIN(age), AVG(age), FROM student GROUP BY college;
SELECT SUM(age), MAX(age), MIN(age), AVG(age), FROM student GROUP BY clazz;
--查询学生总人数大于2的学院
SELECT college,COUNT(*) FROM student GROUP BY college HAVING COUNT(*) > 2;
SELECT * FROM student;
--------------------------------------------排序
--查询所有学生信息并按照年龄升序排列
--OPDER BY: 全局排序,只使用一个reduce,全局有序,但是比较慢
--默认升序(ASC),也可以指定降序(DESC)
SELECT * FROM student
WHERE age>19
ORDER BY age;
SELECT * FROM student
WHERE age>10
ORDER BY age DESC;
--SORT BY 可以使用多个reduce,每个reduce 输出的数据有序,全局无序
SELECT * FROM student SORT BY age;
--设置reduce的个数
SET mapred.reduce.tasks = 2;
--SORT BY 通常搭配DISTRIBUTE BY 使用
--DISTRIBUTE BY 保证列值相同的数据发送到同一个reduce 进行处理
SELECT * FROM student DISTRIBUTE BY college SORT BY id ;
SELECT * FROM student ORDER BY college, age;
--如果STRORT BY 和DISTRIBUTE BY 使用的是相同列 那么还可以合并成为一个CLUSE BY 子句
--------------------------------------------子查询
--子查询是指在一个完整的查询语句中,嵌套若干个不同功能的小查询,从而完成复杂查询的编写形式
--Hive 只支持WHERE 和FROM 子句中的子查询
--并且WHERE 子查询只支持IN,NOT,IN,EXISTS 和NOT,EXISTS四种情况
USE default;
--查询年龄大于20的学生平均年龄
SELECT AVG(age)
FROM (
SELECT age
FROM student
WHERE age >20
)a;
--查询zhangsan老师教授的课程名称
SELECT a.course_name
FROM score a
WHERE EXISTS ( --EXISTS如果子句存在数据就执行外层,不存在则不执行)
SELECT b.name
FROM teacher b
WHERE b.name = 'zhangsan' AND b.id = a.teacher_id
);
SELECT a.course_name
FROM score a
WHERE a.teacher_id IN (
SELECT b.id
FROM teacher b
WHERE b.name = 'zhangsan'
)