外连接

计算机领域术语
订阅
订阅
0有用+1
0
外连接是关系数据库中的连接操作,主要用于合并两个或多个表中的数据,与内连接的核心区别在于其至少保留一个表的全部行。根据连接方向可分为左外连接、右外连接和全外连接三种类型。
左外连接以左表为基表,完整显示左表数据并匹配右表记录,缺失部分以NULL填充;右外连接则保留右表所有行并匹配左表数据。全外连接同时保留左右两表全部数据,未匹配部分补充NULL,但无法通过“(+)”操作符实现。Oracle数据库支持“(+)”符号简化外连接语法,但存在限制:仅适用于左/右外连接,需在WHERE子句中使用且不可与其他JOIN语法混用,多条件时需在所有条件中添加“(+)”。
“(+)”语法是早期数据库系统实现外连接的过渡方案,现代SQL标准则使用LEFT JOIN、RIGHT JOIN等关键字明确连接类型,提升了代码可读性和规范性。
中文名
外连接
外文名
outer join
分    为
三种
分别是
左外连接,右外连接,全外连接
对应SQL
LEFT/RIGHT/FULL OUTER JOIN

基本信息

播报
编辑
outer join在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。如果基表的数据在另一张表没有记录。那么在相关联的结果集行中列显示为空值(NULL)。
对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
3.(+)操作符只适用于列,而不能用在表达式上。
4.(+)操作符不能与or和in操作符一起使用。
5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
举例:
SQL> select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
3 big bird
4 exc
9 怀宁
SQL>select * from dave;
ID NAME
---------- ----------
8 安庆
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm

分类

播报
编辑
全外连接(fullouter join/ full join)
左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。
示例:
SQL> select * from dave a full join bl b on a .id = b .id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
已选择9行。
SQL> select * from dave a full outer join bl b on a .id = b .id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安庆
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
9 怀宁
已选择9行。
左外连接(Left outer join/ left join)
left join是以左表的记录为基础的,示例中Dave可以看成左表,BL可以看成右表,它的结果集是Dave表中的数据,在加上Dave表和BL表匹配的数据。换句话说,左表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录。BL表记录不足的地方均为NULL。
示例:
SQL> select *from dave a left join bl b on a .id=b .id ;
ID NAME ID NAME
--------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm -- 此处B表为null,因为没有匹配到
8 安庆 -- 此处B表为null,因为没有匹配到
SQL> select *from dave a left outer join bl b on a .id= b .id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安庆
用(+)来实现, 这个加号可以这样来理解:+ 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。
SQL> Select *from dave a,bl b where a .id=b .id(+); -- 注意: 用(+) 就要用关键字where
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安庆
右外连接(rightouter join/ right join
和left join的结果刚好相反,是以右表(BL)为基础的, 显示BL表的所以记录,在加上Dave和BL 匹配的结果。Dave表不足的地方用NULL填充。
示例:
SQL>select * from dave a right join bl b on a .id = b .id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁 --此处左表不足用Null填充
已选择7行。
SQL>select * from dave a right outer join bl b on a .id= b .id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁 --此处左表不足用Null填充
已选择7行。
用(+)来实现, 这个+号可以这样来理解:+ 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。
SQL> Select * from dave a,bl b where a .id(+)=b .id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 怀宁

发展历程

播报
编辑
SQL-92标准是一次重大升级,引入了外连接(LEFT JOIN、RIGHT JOIN、FULL JOIN)作为明确的语法。该标准提倡使用显式的JOIN...ON语法,避免使用逗号连接,使查询意图更清晰,并成为多数数据库兼容的事实基线。 [7]

语法与操作

播报
编辑
SQL-92标准的外连接语法为 [3] [5]关键字可以省略但建议明确使用 [2]。连接操作使用子句来指定表之间的关联字段,且连接条件应具有可比性 [3]。外连接会返回指定表(左表、右表或全部)的所有行,未匹配到的部分用填充,这是其与内连接的核心区别 [1-2] [4-6] [8-10]。可以在子句中对连接后的结果集进行筛选,例如使用来查找在另一表中没有匹配项的行 [2]
外连接可以与其他连接(内连接、外连接)组合形成多层查询,此时表的顺序和连接类型需要仔细设计,因为值的引入可能导致逻辑复杂化 [2] [12](全外连接)并非所有数据库系统都显式支持,但可通过联合查询等其他方式实现相同效果 [12-13]。Oracle数据库特有的写法是旧式语法,标准SQL推荐使用语法 [7]

应用

播报
编辑
外连接是数据库查询中用于确保数据完整性的关键技术。 [10]左连接常用于以主表为基础,关联事实表,确保主表信息不丢失,即使关联表中没有匹配记录,结果中仍会显示主表记录并用NULL填充缺失值。全外连接适用于需要同时保留两个表所有数据的场景,例如同时查看所有企业的基本信息和财务数据,即使某些数据缺失。 [11]在某些数据库系统如Access中,不显式支持完全外部联接,但可以使用联合查询实现相同的效果。 [12-13]

相关衍生

播报
编辑
外连接在SQL语言中具体表现为三种类型:左外连接、右外连接和全外连接。根据SQL-92标准,其完整关键字为LEFT OUTER JOIN、RIGHT OUTER JOIN和FULL OUTER JOIN。在实际使用中,OUTER关键字常被省略,简写为LEFT JOIN、RIGHT JOIN和FULL JOIN [1-2] [4] [6]
外连接的概念和标准语法是在SQL-92标准中被正式引入的,该标准是SQL语言的一次重大升级,明确了外连接的语法规范,并成为后续数据库系统兼容的事实基线 [7]
在数据库查询中,连接操作除了外连接,还包括内连接、交叉连接和不等连接 [12-13]