GBase 8a各种join的不同,left right inner full outer等样例

本文通过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)