GBase 8s内连接和外连接

GBase 8s内连接和外连接

内连接(INNER JOIN)

内连接(INNER JOIN)是最常用的连接类型之一,它根据两个或多个表之间的共同列值来联接这些表。在内连接中,只有在连接的表之间有匹配的值时,才会返回结果。
内加接语法示例:

-- 基中 INNER 关键字 可省略
select * 
from tableft INNER JOIN tabright 
  ON tableft.col1 = tabright.col1;

结果:

col1col2col1col3
3左0033右003
3左0033右005
3左0043右003
3左0043右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;

结果:

col1col2col3
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;

结果:

col1col2col1col3
1左001NULLNULL
NULL左002NULLNULL
3左0033右003
3左0033右005
3左0043右003
3左0043右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;

结果:

col1col3col1col2
2右002NULLNULL
3右0033左003
3右0033左004
3右0053左003
3右0053左004

在上面的例子中,我们使用右外连接,从 tabright 表中返回所有的数据,如果 tableft 表中无对应的数据,将被填充为NULL值。

全外连接(FULL OUTER JOIN)

全外连接(FULL OUTER JOIN)则返回左边表和右边表的所有记录,即使没有匹配的行也不会被过滤掉。如果没有匹配的行,则返回NULL值。
全外连接的语法如下:

-- 基中 OUTER 关键字可省略
SELECT * 
FROM tableft FULL OUTER JOIN tabright
  ON tableft.col1 = tabright.col1;

结果:

col1col2col1col3结果集说明
1左001NULLNULL左连接
NULL左002NULLNULL左连接
3左0033右003左连接、右连接
3左0033右005左连接、右连接
3左0043右003左连接、右连接
3左0043右005左连接、右连接
NULLNULL2右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, 内连接, 外连接, 自然连接, LEFT JOIN

添加新评论