Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

外连接

Posted on 2009-08-11 18:07 Prayer 阅读(412) 评论(0)  编辑 收藏 引用 所属分类: 数据库,SQLDB2
最常规的连接,即内(inner)连接。内连接的结果集仅包含在连接表中相匹配的行。
当我们需要连接表中不满足连接条件的非匹配行的数值时,怎么办?这就需要外连接操作。外连接的结果集不仅包含符合连接条件的匹配行,而且还包含不满足连接条件的非匹配行。存在一些不同类型的外连接。
  在深入讨论外连接的细节前,我们首先看看连接两张表的显式语法。我们将从使用该语法的内连接开始。下面的连接实例给出了一个结果集,该结果集包括test_taken表中的每个考生的名字、电话号码以及最高得分。

SELECT fname, wphone, MAX(INTEGER(score))
FROM db2cert.candidate c
INNER JOIN db2cert.test_taken tt ON c.cid=tt.cid
GROUP BY fname, wphone

在该语法中,与连接操作一起,用户指出要进行连接的表和连接列。
观察上例中的内部连接操作符,它属于语句中FROM子句。INNER JOIN(内连接)操作符规定了在该语句中将使用内部连接。关键词ON用来规定连接表的连接条件。在我们的例子中,连接条件基于连接列,即candidate表的cid列和test_taken表的cid列。
显式连接语法也允许用户指定一个外连接。

1)左外连接(Left Outer Join)
左外连接也称为左连接,其结果集既包括连接表的匹配元组,也包括左连接表(左关系)的所有元组(行)。左连接表是连接操作语句中LEFT OUTER JOIN操作符左边的连接表。

注意:也可以使用LEFT JOIN指示一个左连接操作。
现在要求我们产生一个candidate表中出现的每个考生的名字、电话号码以及最高得分的报表。假如我们采用内连接,正如上例中所示的,报表仅包括在test_taken表中出现的那些考生的数据。
我们将要使用如下所示的左外连接实现该目的。

SELECT fname, wphone, MAX(INTEGER(score))
FROM db2cert.candidate c
LEFT OUTER JOIN db2cert.test_taken tt ON c.cid=tt.cid
GROUP BY fname, wphone

观察左外连接SQL语句的语法,LEFT OUTER JOIN操作符用来表明左外连接操作。在该例中,结果集也包括那些不在test_taken表中的考生,对于那些考生,MAX(INTEGER(score))列将显示空值。

2)右外连接(Right Outer Join)
右外连接也称为右连接,其结果集既包括连接表的匹配元组,也包括右连接表的所有元组。右连接表是连接操作语句中RIGHT OUTER JOIN操作符右边的连接表。
使用右外连接的例子如下所示:

SELECT name, count(DISTINCT char(tt.cid))
FROM db2cert.test_taken tt
RIGHT OUTER JOIN db2cert.test t
ON tt.number = t.number
GROUP BY name

该例将获得test表中出现的所有考试的名字以及计划或已经参加该考试的考生人数。注意,可能有一些考试没有安排考生。使用内连接语句,用户将不能知悉那些没有安排考生的考试,使用右连接却可以做到这一点。

3)全外连接(Full Outer Join)
全外连接操作符产生的结果集不仅包含符合连接条件的匹配行,而且包括两个连接表中的所有记录。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理