HIVE SQL 关联查找总结

创建表1:

create table testdb1(id int,name string, age int, pdate string)

创建表2:

create table testdb2(id int,name string, pdate string)

依次插入数据库成员:

insert into testdb1 values (1,"Alice",24,"20210529")
insert into testdb1 values (2,"Bob",16,"20210529")
insert into testdb1 values (3,"Tom",23,"20210529")
insert into testdb1 values (4,"Lili",21,"20210529")
insert into testdb2 values (1,"Alice","20210529")
insert into testdb2 values (3,"Bob","20210529")
insert into testdb2 values (6,"Zidane","20210529")

两个表的内容如下:

testdb1.id	testdb1.name	testdb1.age	testdb1.pdate
1	Alice	24	20210529
4	Lili	21	20210529
2	Bob	16	20210529
3	Tom	23	20210529
testdb2.id	testdb2.name	testdb2.pdate
6	Zidane	20210529
1	Alice	20210529
3	Bob	20210529

如果我们希望查找name相同的数据并合并两个数据库的信息,则可以通过关联的方法,通常使用inner join 的方法:

select *
FROM
testdb1 a inner join testdb2 b
on
a.name = b.name

这里需要注意,on后面的条件判断必须添加别名(这里是a和b)来实现,如果用表名本身将报错不会被识别。

结果如下:

a.id	a.name	a.age	a.pdate	b.id	b.name	b.pdate
1	Alice	24	20210529	1	Alice	20210529
2	Bob	16	20210529	3	Bob	20210529

即inner join的方法会将右边的数据表根据判断条件,如果判定成功就会拼接到左边的数据库。如果判断条件重复会怎么样呢,我们再插入一个元素:

insert into testdb2 values (4,"Bob","20210529")

此时testdb2的内容为:

testdb2.id	testdb2.name	testdb2.pdate
6	Zidane	20210529
1	Alice	20210529
4	Bob	20210529
3	Bob	20210529

再次执行关联查找后结果如下:

a.id	a.name	a.age	a.pdate	b.id	b.name	b.pdate
1	Alice	24	20210529	1	Alice	20210529
2	Bob	16	20210529	3	Bob	20210529
2	Bob	16	20210529	4	Bob	20210529

可以看到对于重复的情况会重复多行展示,如果在testb1中再插入一条

insert into reco.testdb1 values (5,"Bob",19,"20210529")

关联查询结果如下:

a.id	a.name	a.age	a.pdate	b.id	b.name	b.pdate
1	Alice	24	20210529	1	Alice	20210529
2	Bob	16	20210529	3	Bob	20210529
2	Bob	16	20210529	4	Bob	20210529
5	Bob	19	20210529	3	Bob	20210529
5	Bob	19	20210529	4	Bob	20210529

可以看到会列举所有的情况进行合并。

去重复问题,那么此时会有问题,如果对于重复字段如果只想保留一个那么该如何操作呢?这里我们需要用到SQL中的distinct的功能来实现:

select distinct(a.name)
FROM
testdb1 a inner join testdb2 b
on
a.name = b.name

注意这里的执行顺序,由于会先执行关联,因此字段名要写成a.name。

下面继续给一个3个表的例子:

insert into testdb1 values (1,"Alice",24,"20210529")
insert into testdb1 values (2,"Bob",16,"20210529")
insert into testdb1 values (3,"Tom",23,"20210529")
insert into testdb1 values (4,"Lili",21,"20210529")
insert into testdb2 values (1,"Alice",21,"20210529")
insert into testdb2 values (3,"Bob",22,"20210529")
insert into testdb2 values (6,"Tom",23,"20210529")
insert into testdb3 values (1,"Alice",24,"20210529")
insert into testdb3 values (2,"Bob",16,"20210529")
insert into testdb3 values (4,"Lili",21,"20210529")

关联查找如下:

select
*
from
testdb1 a inner join testdb2 b
on
a.name = b.name
inner join reco.testdb3 c
on
a.name = c.name

保留字段可以得到:

select
a.id as id,
a.name as name,
a.age as age
from
testdb1 a inner join testdb2 b
on
a.name = b.name
inner join testdb3 c
on
a.name = c.name

### Hive SQL Left Join 使用教程 #### 左连接的基础概念 在Hive SQL中,`LEFT JOIN`用于返回左表中的所有记录以及右表中存在的匹配记录。如果右表中不存在匹配,则结果集中来自右表的列将包含NULL值[^1]。 #### `ON` 条件与 `WHERE` 条件的区别 当执行带有`LEFT JOIN`的操作时,在`ON`子句中指定的条件仅影响如何关联两表的数据行。而`WHERE`子句则是在完成联接之后进一步过滤最终的结果集。这意味着: - 当条件放置于`ON`语句内时,该条件只应用于决定哪些右边表格的行应该链接到左边表格上; - 若相同条件下移至`WHERE`部分,则会先做完整的外连接操作后再依据此条件删除不符合要求的整行数据[^2]。 #### 示例代码展示两种不同写法的效果差异 ```sql -- SQL 语句 1: ON 子句中含有额外条件的情况 SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.id = t2.id AND t2.id <> 2; -- SQL 语句 2: WHERE 子句中含有额外条件的情况 SELECT t1.id, t2.id FROM t1 LEFT JOIN t2 ON t1.id = t2.id WHERE t2.id <> 2; ``` 在这两个例子中,第一个SQL语句会在`t2.id=2`的情况下保留`t1`的所有记录,并给`t2`对应的列为null;第二个SQL语句则不会显示任何`t2.id=2`的相关记录,即使存在这样的`t1`记录也会因为后续的`WHERE`过滤掉[^3]。 #### 执行过程解释 对于`LEFT JOIN`来说,其工作流程大致如下: 1. **读取左侧输入**:从左表(即`t1`)开始处理每一行作为当前行。 2. **查找右侧对应项**:尝试找到满足`JOIN ... ON`条件下的右表(即`t2`)里的相配对行。 3. **组合输出**:根据是否找到了符合条件的右表条目来构建新的联合后的行。如果没有找到合适的右表项目,则用NULL填充那些本应来自于右表的位置。 4. **应用附加筛选器**:如果有定义了`WHERE`子句或其他形式的后期过滤逻辑的话,此时会对之前得到的结果再次施加这些约束以获得最后想要看到的内容列表。 这种机制确保了无论何时都会至少保持住整个原始左表的信息完整性,同时允许灵活地加入更多关于另一侧参与者的特定信息或限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值