hive 四種join的區別
tableA的結構及資料:
id name grade dept
1 lijie1 100.0 10
2 lijie2 90.0 20
3 lijie3 60.0 10
4 lijie4 80.0 10
5 lijie5 70.0 20
tableB的結構及資料:
id name
10 IT1
20 IT2
文章目錄
**1、兩張left join且同時查詢分數大於80的資料**
**2、兩張表right join且查詢分數大於80分的資料**
**3、兩張join且同時查詢分數大於80的資料**
**4、兩張full join且同時查詢分數大於80的資料**
**4中join區別的結論:**
**PS:**
**on與where的區別:**
1、兩張left join且同時查詢分數大於80的資料
條件放在on上面
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a left join tableB b on a.dept=b.id and a.grade>80;
on結果為:
a.id a.name a.grade a.dept b.id b.name
1 lijie1 100.0 10 10 IT1
2 lijie2 90.0 20 20 IT2
3 lijie3 60.0 10 NULL NULL
4 lijie4 80.0 10 NULL NULL
5 lijie5 70.0 20 NULL NULL
條件放在where上面:
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a left join tableB b where a.dept=b.id and a.grade>80;
where結果為:
a.id a.name a.grade a.dept b.id b.name
1 lijie1 100.0 10 10 IT1
2 lijie2 90.0 20 20 IT2
區別:
on 和 where 在篩選條件的時候,on 會顯示所有滿足 | 不滿足條件的資料而 where 只顯示滿足條件的資料。
2、兩張表right join且查詢分數大於80分的資料
條件放在on上:
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a right join tableB b on a.dept=b.id and a.grade>80;
結果為:
a.id a.name a.grade a.dept b.id b.name
1 lijie1 100.0 10 10 IT1
2 lijie2 90.0 20 20 IT2
條件放在where上:
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a right join tableB b where a.dept=b.id and a.grade>80;
結果為:
a.id a.name a.grade a.dept b.id b.name
1 lijie1 100.0 10 10 IT1
2 lijie2 90.0 20 20 IT2
區別:無
3、兩張join且同時查詢分數大於80的資料
條件放在on上:
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a join tableB b on a.dept=b.id and a.grade>80;
結果為:
a.id a.name a.grade a.dept b.id b.name
1 lijie1 100.0 10 10 IT1
2 lijie2 90.0 20 20 IT2
條件放在where上:
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a join tableB b where a.dept=b.id and a.grade>80;
結果為:
a.id a.name a.grade a.dept b.id b.name
1 lijie1 100.0 10 10 IT1
2 lijie2 90.0 20 20 IT2
區別:無
4、兩張full join且同時查詢分數大於80的資料
條件放在on上:
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a full join tableB b on a.dept=b.id and a.grade>80;
結果為:
a.id a.name a.grade a.dept b.id b.name
4 lijie4 80.0 10 NULL NULL
3 lijie3 60.0 10 NULL NULL
1 lijie1 100.0 10 10 IT1
5 lijie5 70.0 20 NULL NULL
2 lijie2 90.0 20 20 IT2
條件放在where上:
select a.id,a.name,a.grade,a.dept,b.id,b.name from tableA a full join tableB b where a.dept=b.id and a.grade>80;
結果為:
a.id a.name a.grade a.dept b.id b.name
1 lijie1 100.0 10 10 IT1
2 lijie2 90.0 20 20 IT2
區別:
on 和 where 在篩選條件的時候,on 會顯示所有滿足 | 不滿足條件的資料而 where 只顯示滿足條件的資料。
4中join區別的結論:
在on條件下
join 內連線: 篩選條件嚴格,只要不滿足條件的這一項資料就不會顯示出來,不論是哪個表的這一行資料-等值連線。
left join 左外連線: 左外連線就是在等值連線的基礎上加上主表中的未匹配資料。
right join 右外連線: 右外連線是在等值連線的基礎上加上被連線表的不匹配資料 。
full join 滿外連線: 全外連線是在等值連線的基礎上將左表和右表的未匹配資料都加上。
PS:
在這裡我也不清楚為什麼我右表的資料會顯示NULL,按理說應該顯示資料內容的。
where條件免疫,所有的join型別都按照內連線處理。
on與where的區別:
on對join型別的改變而會有反應而where沒有,只是當個連線作用對where來說。
---------------------
作者:aaaaajiboke
來源:CSDN
原文:https://blog.csdn.net/aaaaajiboke/article/details/82730012
版權宣告:本文為博主原創文章,轉載請附上博文連結!