数据准备:


Tips:
(1)SQL 语言大小写不敏感。
(2)SQL 可以写在一行或者多行。
(3)关键字不能被缩写也不能分行。
(4)各子句一般要分行写。
(5)使用缩进提高语句的可读性。
hive (default)> select * from emp;

select empno, ename from emp;

hive (default)>
select
ename AS name,
deptno dn
from emp;

典型的查询会返回多行数据。limit子句用于限制返回的行数。
hive (default)> select * from emp limit 5;

hive (default)> select * from emp limit 2,3; -- 表示从第2行开始,向下抓取3行

查询出薪水大于1000的所有员工。
hive (default)> select * from emp where sal > 1000;
注意:where子句中不能使用字段别名。




select ename,sal from where sal between 1000 and 2000;

select ename,job from emp where job is null;

select ename from emp where ename like '小%';

select ename from emp where ename like '小_';


(1)查询薪水大于1000,部门是30
hive (default)>
select
*
from emp
where sal > 1000 and deptno = 30;
(2)查询薪水大于1000,或者部门是30
hive (default)>
select
*
from emp
where sal>1000 or deptno=30;
(3)查询除了20部门和30部门以外的员工信息
hive (default)>
select
*
from emp
where deptno not in(30, 20);
(1)求总行数(count)
hive (default)> select count(*) cnt from emp;


(2)求工资的最大值(max)
hive (default)> select max(sal) max_sal from emp;


(3)求工资的最小值(min)
hive (default)> select min(sal) min_sal from emp;

(4)求工资的总和(sum)
hive (default)> select sum(sal) sum_sal from emp;

(5)求工资的平均值(avg)
hive (default)> select avg(sal) avg_sal from emp;


having与where不同点
(1)求每个部门的平均薪水
hive (default)>
select
deptno,
avg(sal)
from emp
group by deptno;


(2)求平均薪水大于2000的部门。
hive (default)>
select
deptno,
avg(sal) avg_sal
from emp
group by deptno
having avg_sal > 2000;


Hive支持通常的sql join语句,支持等值连接,也支持非等值连接。
(1)根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称。
hive (default)>
select
e.empno,
e.ename,
d.dname
from emp e --重命名
join dept d
on e.deptno = d.deptno; --员工表和部门表中的部门编号相等
表的别名


(2)合并员工表和部门表。
hive (default)>
select
e.*,
d.*
from emp e
join dept d
on e.deptno = d.deptno;


内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
hive (default)>
select
e.empno,
e.ename,
d.deptno
from emp e
join dept d
on e.deptno = d.deptno;

join操作符左边表中符合where子句的所有记录将会被返回。
hive (default)>
select
e.empno,
e.ename,
d.deptno
from emp e
left join dept d
on e.deptno = d.deptno;

join操作符右边表中符合where子句的所有记录将会被返回。
hive (default)>
select
e.empno,
e.ename,
d.deptno
from emp e
right join dept d
on e.deptno = d.deptno;

将会返回所有表中符合where语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用null值替代。
hive (default)>
select
e.empno,
e.ename,
d.deptno
from emp e
full join dept d
on e.deptno = d.deptno;


hive (default)>
select
e.ename,
d.dname,
l.loc_name
from emp e
join dept d
on d.deptno = e.deptno
join location l
on d.loc = l.loc;

笛卡尔集会在下面条件下产生
hive (default)>
select
empno,
dname
from emp, dept;

union和union all都是上下拼接sql的结果,这点是和join有区别的,join是左右关联,union和union all是上下拼接。将员工表30部门的员工信息和40部门的员工信息,利用union进行拼接显示。
hive (default)>
select
*
from emp
where deptno=30
union
select
*
from emp
where deptno=40;

Order By:全局排序,只有一个Reduce。
(1)查询员工信息按工资升序排列
hive (default)>
select
*
from emp
order by sal;


(2)查询员工信息按工资降序排列
hive (default)>
select
*
from emp
order by sal desc;

(3)按照别名排序
hive (default)>
select
ename,
sal * 2 twosal
from emp
order by twosal;


(4)多个列排序案例
按照部门和工资升序排序。
hive (default)>
select
ename,
deptno,
sal
from emp
order by deptno, sal;


Sort By:对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用Sort by。
Sort by为每个reduce产生一个排序文件。
每个Reduce内部进行排序,对全局结果集来说不是排序。
1)设置reduce个数
hive (default)> set mapreduce.job.reduces=3;
2)查看设置reduce个数
hive (default)> set mapreduce.job.reduces;
3)根据部门编号降序查看员工信息
hive (default)>
select
*
from emp
sort by deptno desc;
每个Reduce内部进行排序,对全局结果集来说不是排序(局部有序)。


4)将查询结果导入到文件中(按照部门编号降序排序)
hive (default)> insert overwrite local directory '/opt/module/hive/datas/sortby'
select * from emp sort by deptno desc;

每个reduce内有序。

(1)先按照部门编号分区,再按照员工薪资排序
hive (default)> set mapreduce.job.reduces=3;
select
*
from emp
distribute by deptno
sort by sal desc;


(1)以下两种写法等价
hive (default)>
select
*
from emp
cluster by deptno;
hive (default)>
select
*
from emp
distribute by deptno
sort by deptno;
注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。
