hive內聯接和外聯接

2022-07-27 10:12:08 字數 2221 閱讀 3694

hql很多語句和sql有相似之處,下面用例子快速了解內外聯接的用法

在多表操作的時候,經常會遇到需要的資料,一部分存在a表,一部分存在b表,或者存在更多的表中。

而我們可以從這些表的關係進行聯接,下面建立兩個表進行例項演示:

首先建立乙個學生資訊表,有id,s_name,c_name三個屬性

hive>

create

table

stu_msg(

>

id string,

>

s_name string,

>

c_name string)

>

row format delimited

> fileds terminated by',

'> ;

再建立乙個成績表,有id,score兩種屬性

hive>

create

table

score_msg(

>

id string

> ,score int

)

>

row format delimited

> fields terminated by',

'> lines terminated by'\n

';

新增對應資料於兩表之中:

insert

into

table stu_msg values('

1','

zhangsan

','math

'),('

2','

lisi

','english

'),('

3','

wangwu

','history');

insert

into

table score_msg values('

1',99),('

3',88),('

4',66);

在兩個表之間,不難發現學生表的id和成績表的id存在關係,所以我們可以通過二者的關係進行聯接查詢。

一、首先是內聯接(通過指定關係對a和b表進行匹配,把能匹配到的結果進行返回,匹配不到的則不返回):

返回結果就是id為1和2的學生資訊和成績,為什麼3的資訊和4的成績不返回呢?

因為在學生表中,id為3的學生在成績表中並沒有資訊,所以匹配不到對應資料,而id為4的學生在學生表中卻沒有資訊,只有成績,也同樣無法進行匹配,而內聯接中,無法匹配的就不會查詢返回出來。

二、外聯接(左聯接,右聯接,完全聯接...)

1、左連線:

select stu_msg.*,score_msg.*

from stu_msg left

join score_msg on stu_msg.id=score_msg.id;

返回結果:

不難發現,學生表的資料全部返回,而成績表的資料id為4的同學依然沒有列印出來,而且結果還有兩個空值。

以left join 為中心,stu_msg為左側表,而score_msg為右側表,左聯接就是通過以左表對指定屬性進行匹配,不管匹配是否成功,左表資料全部返回,而右表資料只返回被成功匹配的。

空值是因為,左表資料沒有對應的資料進行匹配,就以null來代替。

2、反之右聯接的結果如下:

3、完全聯接:

select stu_msg.*,score_msg.*

from stu_msg full

join score_msg on stu_msg.id=score_msg.id;

資料庫內聯接 左外聯接 右外聯接和全聯接

首先給出兩張表用於之後的舉例 stuno stuname gradeid 1001張三1 1002李四2 1003王五3 1004 西楚霸王 1000 gradeid grade 1一年級 2二年級 3三年級 4四年級 顯示結果為符合條件的多個表間的交集。例 select from grade g,...

SQL中內聯接與外聯接小結

內聯接與外聯接的區別通過例項來說明是最清楚的了,下面先準備好測試環境 create database test go create table t1 deptid int,uname char 10 create table t2 deptid int,memo char 50 insert int...

外聯接小結

連環多表外聯接 select from circuit c,device d,resgroup g,portinfo p,devaddr a,device b,devaddr ba where c.circuitid cirid and c.changetype 0 or c.changetype ...