本文通过GBase 8a 介绍各种JOIN的不同,包括inner join, left join, right join, full outer join, 分别对应内连接,左外连接,右外连接,和全外连接。
目录导航
总结
以A 、B两个表为例,
- A inner join B 是必须A存在,B也存在
- A left join B 是A必须存在,B不一定存在,匹配不上就是null
- A right B 是B必须存在,A不一定存在,匹配不上就是null
- A full outer join B, 是left 和 right 的合集, 有A可以没有B, 在加上有B可以没有A
数据
A是事实表,B是维度表,B里没有重复数据。
A表
事实明细表,里面的bid 对应着B表。10行里有4行在B里不存在的。
gbase> select * from A;
+------+------+
| id | bid |
+------+------+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 3 |
| 7 | 66 |
| 8 | 77 |
| 9 | 88 |
| 10 | 99 |
+------+------+
10 rows in set (Elapsed: 00:00:00.01)
B表
维度表,5行里,有2行在明细表里没用到的。
gbase> select * from B;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (Elapsed: 00:00:00.00)
inner join
A里存在且B里也存在,所以预期结果是A里6行结果。
gbase> select * from A inner join B on A.bid=b.id;
+------+------+------+
| id | bid | id |
+------+------+------+
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 1 |
| 4 | 2 | 2 |
| 5 | 2 | 2 |
| 6 | 3 | 3 |
+------+------+------+
6 rows in set (Elapsed: 00:00:00.04)
left join
A里存在,B可以没有匹配上,结果就是A的10行,其中6行匹配上了,4行没有匹配上,为NULL.
gbase> select * from A left join B on A.bid=b.id;
+------+------+------+
| id | bid | id |
+------+------+------+
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 1 |
| 4 | 2 | 2 |
| 5 | 2 | 2 |
| 6 | 3 | 3 |
| 7 | 66 | NULL |
| 8 | 77 | NULL |
| 9 | 88 | NULL |
| 10 | 99 | NULL |
+------+------+------+
10 rows in set (Elapsed: 00:00:00.04)
right join
B必须存在,A可以没有匹配上,结果B的前3个id,匹配上了A表的6行, B还有2行没有A匹配,累计6+2=8行。
gbase> select * from A right join B on A.bid=b.id;
+------+------+------+
| id | bid | id |
+------+------+------+
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 1 |
| 4 | 2 | 2 |
| 5 | 2 | 2 |
| 6 | 3 | 3 |
| NULL | NULL | 4 |
| NULL | NULL | 5 |
+------+------+------+
8 rows in set (Elapsed: 00:00:00.03)
full outer join
left和right的合集, 都匹配的6行, A left B没有匹配上的4行, A right B 没有匹配上的2行,一共 6+4+2=12行。
gbase> select * from A full outer join B on A.bid=b.id;
+------+------+------+
| id | bid | id |
+------+------+------+
| 1 | 1 | 1 |
| 2 | 1 | 1 |
| 3 | 1 | 1 |
| 4 | 2 | 2 |
| 5 | 2 | 2 |
| 6 | 3 | 3 |
| NULL | NULL | 4 |
| NULL | NULL | 5 |
| 7 | 66 | NULL |
| 8 | 77 | NULL |
| 9 | 88 | NULL |
| 10 | 99 | NULL |
+------+------+------+
12 rows in set (Elapsed: 00:00:00.04)