GBase 8s内连接和外连接
GBase 8s内连接和外连接
内连接(INNER JOIN)
内连接(INNER JOIN)是最常用的连接类型之一,它根据两个或多个表之间的共同列值来联接这些表。在内连接中,只有在连接的表之间有匹配的值时,才会返回结果。
内加接语法示例:
-- 基中 INNER 关键字 可省略
select *
from tableft INNER JOIN tabright
ON tableft.col1 = tabright.col1;
结果:
col1 | col2 | col1 | col3 |
---|---|---|---|
3 | 左003 | 3 | 右003 |
3 | 左003 | 3 | 右005 |
3 | 左004 | 3 | 右003 |
3 | 左004 | 3 | 右005 |
在上面的例子中,我们根据 col1 从两个表中联接了 tableft 和 tabright 表,并且只返回了那些在两个表中都存在的数据。
内连接可以改写为直接的多表关联查询:
select *
from tableft, tabright
where tableft.col1 = tabright.col1;
注:内连接与自然连接(NATURAL JOIN)类似,主要区别在于自然连接返回的结果中包含所有属性,但公共列仅保留一份。
GBase 8s不支持自然连接语法。
自然连接的语法:
-- 其它支持NATURAL JOIN语法的数据库
select *
from tableft NATURAL JOIN tabright;
结果:
col1 | col2 | col3 |
---|---|---|
3 | 左003 | 右003 |
3 | 左003 | 右005 |
3 | 左004 | 右003 |
3 | 左004 | 右005 |
与之对应的内连接的语句为:
-- 所有字段列出,但公共字段保留一份
select tableft.col1,col2,col3
from tableft INNER JOIN tabright
ON tableft.col1 = tabright.col1;
外连接(OUTER JOIN)
外连接(OUTER JOIN)是另一种连接类型,它可以返回两个或多个表之间所有的匹配和不匹配的数据。外连接有三种类型:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
左外连接(LEFT OUTER JOIN)
左外连接(LEFT OUTER JOIN)返回左边表的所有记录以及右边表中与左边表列相匹配的记录。如果右边表中没有匹配的行,则返回NULL值。
左外连接的语法如下:
-- 其中 OUTER 关键字可省略
SELECT *
FROM tableft LEFT OUTER JOIN tabright
ON tableft.col1 = tabright.col1;
结果:
col1 | col2 | col1 | col3 |
---|---|---|---|
1 | 左001 | NULL | NULL |
NULL | 左002 | NULL | NULL |
3 | 左003 | 3 | 右003 |
3 | 左003 | 3 | 右005 |
3 | 左004 | 3 | 右003 |
3 | 左004 | 3 | 右005 |
在上面的例子中,我们使用左外连接,从 tableft 表中返回所有的数据,如果 tabright 表中对应的数据,将被填充为NULL值。
外连接优化
如果外连接关联条件的 被驱动表 的连接字段值唯一时,可以将外连接查询优化为子查询
更新示例表中的数据:
update tabright set col1 = 5 where col3 = '右005';
左连接语句:
select tableft.col1,
col2,
col3
from tableft left join tabright
on tableft.col1 = tabright.col1;
可以相应的修改为:
select tableft.col1,
col2,
-- 子查询仅能返回不超过一行
(select col3 from tabright where tabright.col1 = tableft.col1) col3
from tableft;
在返回的数据中,只需要 被驱动表 中的少量数据时 有效。
右外连接(RIGHT OUTER JOIN)
右外连接(RIGHT OUTER JOIN)则相反,它返回右边表的所有记录以及左边表中与右边表列相匹配的记录。如果左边表中没有匹配的行,则返回NULL值。
右外连接的语法如下:
-- 其中 OUTER 关键字可省略
SELECT *
FROM tableft RIGHT OUTER JOIN tabright
ON tableft.col1 = tabright.col1;
结果:
col1 | col3 | col1 | col2 |
---|---|---|---|
2 | 右002 | NULL | NULL |
3 | 右003 | 3 | 左003 |
3 | 右003 | 3 | 左004 |
3 | 右005 | 3 | 左003 |
3 | 右005 | 3 | 左004 |
在上面的例子中,我们使用右外连接,从 tabright 表中返回所有的数据,如果 tableft 表中无对应的数据,将被填充为NULL值。
全外连接(FULL OUTER JOIN)
全外连接(FULL OUTER JOIN)则返回左边表和右边表的所有记录,即使没有匹配的行也不会被过滤掉。如果没有匹配的行,则返回NULL值。
全外连接的语法如下:
-- 基中 OUTER 关键字可省略
SELECT *
FROM tableft FULL OUTER JOIN tabright
ON tableft.col1 = tabright.col1;
结果:
col1 | col2 | col1 | col3 | 结果集说明 |
---|---|---|---|---|
1 | 左001 | NULL | NULL | 左连接 |
NULL | 左002 | NULL | NULL | 左连接 |
3 | 左003 | 3 | 右003 | 左连接、右连接 |
3 | 左003 | 3 | 右005 | 左连接、右连接 |
3 | 左004 | 3 | 右003 | 左连接、右连接 |
3 | 左004 | 3 | 右005 | 左连接、右连接 |
NULL | NULL | 2 | 右002 | 右连接 |
在上面的例子中,我们使用全外连接,返回了所有的数据,无论它们是否有匹配的数据。全外连接的结果集为左外连接和右外连接的并集去重。
总结:
在SQL中,内连接和外连接是在联接多个表时常用的操作。内连接仅返回在连接的表之间有匹配的记录,而外连接则返回匹配和不匹配的记录。左外连接和右外连接分别根据左边表和右边表的数据来返回记录,全外连接则返回两个表的所有记录。
- 内连接(inner join):取出两张表中匹配到的数据,匹配不到的不保留
- 外连接(outer join):取出连接表中匹配到的数据,匹配不到的也会保留,其值为NULL
附件:
示例用到的初始化数据:
-- 左表
DROP TABLE IF EXISTS tableft;
CREATE TABLE tableft (col1 int, col2 varchar(20));
INSERT INTO tableft values(1,'左001');
INSERT INTO tableft values(null,'左002');
INSERT INTO tableft values(3,'左003');
INSERT INTO tableft values(3,'左004');
-- 右表
DROP TABLE IF EXISTS tabright;
CREATE TABLE tabright(col1 int, col3 varchar(20));
INSERT INTO tabright VALUES(2,'右002');
INSERT INTO tabright values(3,'右003');
INSERT INTO tabright values(3,'右005');
- 上一篇: GBase 8s获取对象创建时间的语句
- 下一篇: GBase 8s Docker镜像更新