在hive中没有外键和主键之分。
但是可以进行多表关联查询(值关联)。只要这两个值相等就可以作为关联条件,其实在mysql中也是支持。
mysql中的关联查询
left join左连接
right join右连接
inner
join全连接、内连接
============
t_user
id name
1 zs
2 ls
3 ww
CREATETABLEt_user(id int,name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY
'\t';
t_order
id name u_id
1 p1 1
2 p2 1
3 p1 2
CREATETABLEt_order(id int,name string,u_id int) ROW FORMAT DELIMITED FIELDS
TERMINATED BY '\t';
hive当中的关联查询
1、全连接
join-----两边的数据必需要有关联才会显示。
select *
from t_user join t_order on t_user.id=t_order.u_id
2、左外连接
left outer
join是来自于oracle数据库的语法(左表就没有关联右表数据也会进行显示,只是右表的字段全是null)
select *
from t_user left outer join t_order on t_user.id=t_order.u_id
3、右外连接
select *
from t_user right outer join t_order on t_user.id=t_order.u_id
4、半连接left semi join
已经有一张人口信息表,需要查询出四川、重庆、广州三个省份的人员信息
mysql如何实现?
select *
from t_user where省份=四川or省份=重庆or省份=广州
另一种方式是采用in
select *
from t_user where省份in (四川,重庆,广州)
hive中没有in的语法。但是有一个left semi join【半连接】
select *
from t_user left semi join t_order on t_user.id=t_order.u_id
from后面的表为显示表,left semi join后面的表为条件表,只会显示显示表中的内容
执行结果是相同:
select *
from t_user where id in (select u_id from t_order);
======================
当你做多重关联查询的时候,是否存在一个加载数据的顺序?
顺序第一张是越大越好,还是越小越好?
select *
from a1 left outer join b1 on a1.id=b1.a_id left outer join c on c1.id=b.c_id