hive查询语句与mysql不同的地方

这是网上数据库例题经常使用的两张表emp和dept表,第一个是dept,第二个是emp

 为了方便观看,我给上面加了每列的字段名称 

hive查询语句与mysql不同的地方_第1张图片

 hive查询语句与mysql不同的地方_第2张图片

1.hive不支持部分子查询

比如这个题目:查询出工资比SMITH高的员工名称

mysql一句话就可以结束了

select ename from emp where sal>(select sal from emp where ename='SMITH');

 hive查询语句与mysql不同的地方_第3张图片

我们在hive中运行这个是会报错的 

hive> select ename from emp where sal>(select sal from emp where ename='SMITH');

 hive不支持where后面跟子查询 这些包括

where  >子查询语句

where <子查询语句

where = 子查询语句

where <> 子查询语句

select ename from emp where sal>(select sal from emp where ename='SMITH');
select ename from emp where sal<(select sal from emp where ename='SMITH');
select ename from emp where sal=(select sal from emp where ename='SMITH');
select ename from emp where sal<>(select sal from emp where ename='SMITH');

给出解决办法是:

我们需要对这2张表的每一行打上一个标签,然后连接2张表,在where后面筛选条件

比如这个题目里的求得是工资大于smith的人

也就是我们遇到这种问题的时候得先考虑表连接,二次查询中在where放入对应的筛选条件

select e.ENAME 
      ,e.SAL 
from 
(select ENAME 
       ,SAL 
       ,1 as cid 
from emp)e 
left join 
(select SAL 
        ,1 as cid 
from emp 
where ENAME='SMITH')
s on e.cid=s.cid 
where e.SAL>s.SAL;

2.hive不支持非等值连接

select * from emp join dept on emp.DEPTNO>dept.DEPTNO;

 hive查询语句与mysql不同的地方_第4张图片

hive不支持非等值连接,我写大于 、小于、不等于 都是不行的

因为mapreduce 很难将这些条件处理成一个map任务

hive> select * from emp join dept on emp.DEPTNO>dept.DEPTNO;
hive> select * from emp join dept on emp.DEPTNO select * from emp join dept on emp.DEPTNO<>dept.DEPTNO;

//统一报错:
FAILED: SemanticException [Error 10017]: Line 1:31 Both left and right aliases encountered in JOIN 'DEPTNO'

解决办法还没想到,日后更新

3.hive支持多表连接查询

hive对join对象启动一个mapreduce任务,对表e和表d连接后,在启动一个mapreduce任务,将上面的连接结果再和下面的表l连接

hive是按从左往右的顺序执行的,所以不用担心表e会跳过表d直接和表l连接

select e.ename,d.deptno,l.name
from emp e
join dept d
on d.deptno=e.deptno
join location l
on d.loc=l.loc;

4.hive中的笛卡尔积

1.省略了连接条件

2.连接条件无效

3.所有表中的所有行互相连接

hive> select empno,deptname from emp,dept;

hive查询语句与mysql不同的地方_第5张图片

5.hive连接谓词不支持or

这种写法在mysql可以,但是hive报错

select e.empno,d.dname from emp e 
join 
dept d 
on e.deptno=d.deptno or e.job=d.job;

所以怎么做呢? 将2个筛选条件分开写成2个语句,再用union拼接起来,最后进行去重

select  DISTINCT tmp.ename,tmp.dname from
(select e.ename,d.dname,e.deptno,e.job from emp e 
join 
dept d 
on e.deptno=d.deptno
union all
select e.ename,d.dname,e.deptno,e.job  from emp e 
join 
dept d 
on e.job=d.job) tmp

hive查询语句与mysql不同的地方_第6张图片

 

你可能感兴趣的:(hive,数据库,database,hive)