Hive-关联查询

SQL语句逻辑执行顺序

		select
		          (4
		from      (1
		tb_name
		where     (2
		group by  (3
		having    (5
		order by  (6
		limit     (7

关联查询
join
inner join
left join
right join
full join
union
union all
left semi join

数据1:
1,a
2,b
3,c
建表
create table tb_a(
id int ,
name string
)
row format delimited fields terminated by ‘,’ ;
load data local inpath ‘/data/a/’ into table tb_a ;

数据2:
1,zss
2,lss
3,www
1,xxx
2,yyy
4,zzz
建表
create table tb_b(
id int ,
name string
)
row format delimited fields terminated by ‘,’ ;
load data local inpath ‘/data/b/’ into table tb_b ;
建好的两张表:
±---------±-----------+
| tb_a.id | tb_a.name |
±---------±-----------+
| 1 | a |
| 2 | b |
| 3 | c |
±---------±-----------+

		+----------+------------+
		| tb_b.id  | tb_b.name  |
		+----------+------------+
		| 1        | zss        |
		| 2        | lss        |
		| 3        | www        |
		| 1        | xxx        |
		| 2        | yyy        |
		| 4        | zzz        |
		-------------------------

** join不带条件 或 , 或 inner join 前面的每一行分别于后面的每行连接**

	select
	*
	from 
	tb_a
	join
	tb_b ;  --笛卡尔积   3 * 6 = 18 

	select
	*
	from 
	tb_a
	inner join
	tb_b ; 

	select
	*
	from 
	tb_a
	,
	tb_b ;

–join按条件连接,id相同的来接在一行输出

	select
	*
	from 
	tb_a
	join
	tb_b 
	on tb_a.id = tb_b.id ;

结果
±---------±-----------±---------±-----------+
| tb_a.id | tb_a.name | tb_b.id | tb_b.name |
±---------±-----------±---------±-----------+
| 1 | a | 1 | zss |
| 2 | b | 2 | lss |
| 3 | c | 3 | www |
| 1 | a | 1 | xxx |
| 2 | b | 2 | yyy |
±---------±-----------±---------±-----------+

–左连接,右侧少的补null,多的去掉
select
*
from
tb_a
left join
tb_b
on tb_a.id = tb_b.id ;
结果
±---------±-----------±---------±-----------+
| tb_a.id | tb_a.name | tb_b.id | tb_b.name |
±---------±-----------±---------±-----------+
| 1 | a | 1 | zss |
| 1 | a | 1 | xxx |
| 2 | b | 2 | lss |
| 2 | b | 2 | yyy |
| 3 | c | 3 | www |
±---------±-----------±---------±-----------+

–右连接,左侧少的补null,多的去掉
select
*
from
tb_a
right join
tb_b
on tb_a.id = tb_b.id ;
结果:
±---------±-----------±---------±-----------+
| tb_a.id | tb_a.name | tb_b.id | tb_b.name |
±---------±-----------±---------±-----------+
| 1 | a | 1 | zss |
| 2 | b | 2 | lss |
| 3 | c | 3 | www |
| 1 | a | 1 | xxx |
| 2 | b | 2 | yyy |
| NULL | NULL | 4 | zzz |
±---------±-----------±---------±-----------+

–查询a中id在b中存在的数据

	select
	*
	from
	tb_a
	left semi join 
	tb_b 
	on tb_a.id = tb_b.id ;

结果
±---------±-----------+
| tb_a.id | tb_a.name |
±---------±-----------+
| 1 | a |
| 2 | b |
| 3 | c |
±---------±-----------+

–查询b中id在a中存在的数据

  1. 普通写法:

     select 
     *
     from 
     tb_a 
     where id in (select id from tb_b)
    

2.使用left semi join:

	select
	*
	from
	tb_b
	left semi join 
	tb_a
	on tb_a.id = tb_b.id ;
	+----------+------------+
	| tb_b.id  | tb_b.name  |
	+----------+------------+
	| 1        | zss        |
	| 2        | lss        |
	| 3        | www        |
	| 1        | xxx        |
	| 2        | yyy        |
	+----------+------------+

union --连接两个查询的结果集 要求字段个数和数据类型一致 union all不会去重

	select
	*
	from
	tb_a
	union all	
	select
	*
	from
	tb_a ; 

	select
	*
	from
	tb_a
	union 
	select
	*
	from
	tb_a ; 
结果:	
	+---------+-----------+
	| _u1.id  | _u1.name  |
	+---------+-----------+
	| 1       | a         |
	| 2       | b         |
	| 3       | c         |
	+---------+-----------+

	select
	*
	from
	tb_a
	where id >=2  
	union   all 
	select
	*
	from
	tb_a 
	where id<=2

;

–前后列数不同 不能union
select
* , name as neme2 – 3列
from
tb_a
where id >=2
union all
select
*
from
tb_a
where id<=2
;

full join全连接
±---------±-----------±---------±-----------+
| tb_a.id | tb_a.name | tb_b.id | tb_b.name |
±---------±-----------±---------±-----------+
| 1 | a | 1 | xxx |
| 1 | a | 1 | zss |
| 2 | b | 2 | yyy |
| 2 | b | 2 | lss |
| 3 | c | 3 | www |
| NULL | NULL | 4 | zzz |
| 5 | e | NULL | NULL |
±---------±-----------±---------±-----------+

多表连接形式
a
join
b
join
c
join
d
on a.id=b.id and b.id=c.id and c.id=d.id ;

		a 
		join
		b 
		on  a.id = b.id)t
		
		join
		c
		on  t.id = c.id)t2
		join
		d 
		on  t2.id = d.id
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

峰二爷

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值