1. 程式人生 > >hive 四種join的區別

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
版權宣告:本文為博主原創文章,轉載請附上博文連結!