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.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.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.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一起使用。
❑该操作符不能用于全外连接。
❑如果外连接有多个条件,那么每一个条件都需要使用该操作符。