Hive的进阶(表的查询)

本文深入讲解了SQL查询语句的结构、执行顺序、注意事项,重点剖析了连接查询(内连接、外连接、半连接及子查询)以及表合并(union与unionall)。同时介绍了Hive中特有的join类型,如leftsemijoin,并揭示了如何在数据库建模中处理实体关系。

一、查询语句基本语法

1.1SQL查询语句的基本结构

select selection_list # 查询的列 
from table # 要查询的表
join on # 连接的表 
where # 查询条件 
group by # 分组查询 
having # 分组条件过滤 
order by # 字段排序 
sort by # 结果排序
limit # 限制结果数 
union/union all # 合并表

1.2SQL语句的执行顺序

from
on 
join
where
group by 
having
select 
distinct
order by
limit

1.3查询注意事项

尽量不要使用子查询、尽量不要使用 in not in select * from aa1
where id in (select id from bb);
查询尽量避免join连接查询,但是这种操作咱们是永远避免不了的。
查询永远是小表驱动大表(永远是小结果集驱动大结果集)

1.4数据库建模

关系型数据库最难的地方,就是建模(model)
错综复杂的数据,需要建立模型,才能储存在数据库。所谓"模型"就是两样东西:实体(entity)+ 关系(relationship)ER图。实体指的是那些实际的对象,带有自己的属性,可以理解成一组相关属性的容器。关系就是实体之间的联系,通常可以分成"一对一"、"一对多"和"多对多"等类型。
在这里插入图片描述

二、连接查询

在关系型数据库里面,每个实体有自己的一张表(table),所有属性都是这张表的字段(field),
表与表之间根据关联字段"连接"(join)在一起。所以,表的连接是关系型数据库的核心问题。

表的连接分成好几种类型。
内连接(inner join)
外连接(outer join)
左连接(left join)
右连接(right join)
全连接(full join)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所谓"连接",就是两张表根据关联字段,组合成一个数据集。
问题是,两张表的关联字段的值 往往是不一致的,如果关联字段不匹配,怎么处理?
比如,表 A 包含张三和李四,表 B 包 含李四和王五,匹配的只有李四这一条记录。

很容易看出,一共有四种处理方法。 只返回两张表匹配的记录,这叫内连接(inner join)。
返回匹配的记录,以及表 A 多余的记录,这叫左连接(left join)。
返回匹配的记录,以及表 B 多余的记录,这叫右连接(right join)。
返回匹配的记录,以及表 A 和表 B 各自的多余记录,这叫全连接(full join)。

下图就是四种连接的图示。

在这里插入图片描述
上图中,表 A 的记录是 123,表 B 的记录是 ABC,颜色表示匹配关系。返回结果中,如果另 一张表没有匹配的记录,则用 null 填充。
这四种连接,又可以分成两大类:
内连接(inner join)表示只包含匹配的记录
外连接 (outer join)表示还包含不匹配的记录。所以,左连接、右连接、全连接都属于外连接。
此外,还存在一种特殊的连接,叫做"交叉连接"(cross join),指的是表 A 和表 B 的不 存在关联字段,这时表 A(共有 n 条记录)与表 B (共有 m 条记录)连接后,会产生一张 包含 n x m 条记录的新表(见下图)。
在这里插入图片描述

Hive中的内连接(inner join)、外连接(outer join)、左连接(left join)、右连接(right join)、全连接(full join)的用法与mysql的一致,这里我们介绍一下Hive中特有join。

1、left semi join

在hive中,有一种专有的join操作,left semi join,我们称之为半开连接。它是left join的一种优化形式,只能查询左表的信息,主要用于解决hive中左表的数据是否存在的问题。相当于exists关键字的用法。

select * from u1 
left semi join u2 on u1.id =u2.id;

2、子查询

# hive对子查询支持不是很友好,特别是 "="问题较多
不能使用= 
select e.* 
from emp e 
where e.deptno = ( 
select d.deptno 
	from dept d 
	limit 1 
);

可以使用in 
select e.* 
from emp e 
where e.deptno in ( 
	select d.deptno 
	from dept d 
);

三、表合并union

如果把两张表 结果联合在一起,可以用union,有下面两种用法

  • union :将多个结果集合并,去重,排序
  • union all :将多个结果集合并,不去重,不排序。
select d.deptno as deptno, 
d.dname as dname 
from dept d 
union 
select 
e.deptno as deptno, 
e.ename as dname 
from emp e; 

select d.deptno as deptno, 
d.dname as dname 
from dept d 
union all 
select 
d.dname as dname, 
d.deptno as deptno 
from dept d;

-- 单个union语句不支持:orderBy、clusterBy、distributeBy、sortBy、limit 
-- 单个union语句字段的个数要求相同,字段的顺序要求相同。

 如果想去重查询中的某列数据,可以使用 distinct关键字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值