5.6.4 外连接

外连接分为左外连接、右外连接、全外连接。它们所表示的含义如下:

❑左外连接:又称为左向外连接。使用左外连接的查询,返回的结果不仅仅是符合连接条件的行记录,还包含了左边表中的全部记录。也就是说,如果左表的某行记录在右表中没有匹配项,则在返回结果中右表的所有选择列表列均为空。

❑右外连接:又称为右向外连接。它与左外连接相反,将右边的表中所有的数据与左表进行匹配,返回的结果除了匹配成功的记录,还包含了右表中未匹配成功的记录,并在其左表对应的列补空值。

❑全外连接:返回所有匹配成功的记录,并返回左表未匹配成功的记录,也返回右表未匹配成功的记录。

下面用示例来理解这些概念。

1.左外连接

【示例39】左外连接

要求检索出PRODUCTINFO表中每个产品对应的产品类型名称。执行以下脚本:


SELECT p.productname,p.productprice,p.category,c.categoryid,c.categoryname FROM productinfo p LEFT JOIN categoryinfo c ON p.category=c.categoryid;


【代码解析】

❑脚本中productinfo是左边的表,它在LEFT JOIN的左边。该脚本将列出productinfo表的所有记录,并和表categoryinfo中的数据进行匹配。也就是说,此时以productinfo表为主表,如果该表中的数据在categoryinfo中没有匹配项,那么对应categoryinfo表中字段的位置用NULL值表示。

【执行效果】

执行效果见图5.39。

5.6.4 外连接 - 图1

图 5.39 左外连接

从图5.39中标示出来的部分可以看出在表categoryinfo中,没有对应“测试”的产品类型编码,此时使用NULL值来填充。

2.右外连接

右外连接和左外连接是相反的,它以右边的表为主表。

【示例40】右外连接

查看哪些产品类型还没有对应的产品。执行以下脚本:


SELECT p.productname,p.productprice,p.category,c.categoryid,c.categoryname

FROM productinfo p RIGHT JOIN categoryinfo c ON p.category=c.categoryid;


【代码解析】

❑在右外连接中,以categoryinfo为主,它将列出所有的数据,并与productinfo表中数据进行匹配。如果productinfo不能完全匹配categoryinfo的记录,那么categoryinfo没有被匹配的记录中对应productinfo的部分,将以NULL值填充。

【执行效果】

执行效果见图5.40。

5.6.4 外连接 - 图2

图 5.40 右外连接

3.全外连接

全外连接就是左外连接和右外连接的综合,它除了返回内连接匹配的数据外,也将返回两个表中不匹配的数据。

【示例41】全外连接

使用全外连接操作表PRODUCTINFO和CATEGORYINFO,对产品类型编码进行匹配。执行以下脚本:


SELECT p.productname,p.productprice,p.category,c.categoryid,c.categoryname

FROM productinfo p FULL JOIN categoryinfo c ON p.category=c.categoryid;


脚本中只把"RIGHT JOIN"改成了"FULL JOIN"。

【执行效果】

执行效果见图5.41。

5.6.4 外连接 - 图3

图 5.41 全外连接

从图5.41中可以看出,全外连接就是左外连接和右外连接的综合。以上示例中没有写OUTER关键字,其实该词可选,读者了解就好。

4.(+)的使用

在Oracle中使用外连接,有一种比较特殊的表示方法,利用“(+)”表示外连接。虽然这种方式可以实现外连接,但Oracle还是建议开发人员使用OUTER JOIN关键字。

(+)的使用方法读者可以简单记一下,该操作符总是放在非主表的一方,并且需要使用WHERE子句,不能存在OUTER JOIN关键字。下面的两段脚本演示了该操作符的使用方法。

(1)左外连接使用(+)演示


SELECT p.productname,p.productprice,p.category,c.categoryid,c.categoryname

FROM productinfo p LEFT JOIN categoryinfo c ON p.category=c.categoryid;


对于以上左外连接脚本可以用以下脚本替代:


SELECT p.productname,p.productprice,p.category,c.categoryid,c.categoryname

FROM productinfo p,categoryinfo c

WHERE p.category=c.categoryid(+);


(2)右外连接使用(+)演示


SELECT p.productname,p.productprice,p.category,c.categoryid,c.categoryname

FROM productinfo p RIGHT JOIN categoryinfo c ON p.category=c.categoryid;


对于以上右外连接脚本可以用以下脚本替代:


SELECT p.productname,p.productprice,p.category,c.categoryid,c.categoryname

FROM productinfo p,categoryinfo c

WHERE p.category(+)=c.categoryid;


使用(+)需要注意的地方有:

❑该操作符只能用在WHERE子句中,并且不能与OUTER JOIN一起使用。

❑该操作符不能用于全外连接。

❑如果外连接有多个条件,那么每一个条件都需要使用该操作符。