I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

 

导 语

关联多个表查找数据的本质是: 先做笛卡尔积(也叫交叉连接),再选取符合条件的行

参考 http://www.360doc.com/content/14/1229/21/7635_436727229.shtml

 

 

 

基于上述表A、B的交叉连接语句是: select * from A,B;  结果如下图,共5*5=25条记录:

 

也可以用select * from B,A; 结果如下:

 

由于只是集合元素间的简单组合,大部分组合是没有意义的。所以需要加条件。比如常见的 A.id=B.id。当然也可以是A.id>B.id,虽然大多数情况下这样的比较没意义。

 

select * from B,A where A.id=B.id; 结果如下:

select * from A,B where A.id>B.id; 结果如下:

 

实例(一)

下图是一个员工信息表EMP。

EMPNO: 编号
ENAME: 姓名
JOB: 职务
MGR: 员工的老板(Manager)的编号


                                 图 (一)

上图中的MGR字段显示的是员工编号,为了把姓名显示出来,我们发出一条SQL语句,得到下图所示结果:


                                                                       图 (二)

内连接INNER JOIN的功能与图二中SQL语句的功能一模一样。如下图:


                                                                            图 (三)

我们发现图二、图三只有13条记录,比图一少了一条记录。是什么原因呢?

原因是INNER JOIN这个方法只选择出满足匹配条件的记录。在这里,匹配条件是e.MGR=b.EMPNO,因为是EMP表与本身作连接,取别名e和b以作区分。

从图一可以看出KING的MGR字段为空,所以没有显示KING的信息。另一种情况是MGR字段的值不在EMPNO范围内时,也不会显示。

下图是改变员工ALLEN的MGR字段值为0000后的查询结果,其中KING与ALLEN的信息都不在查询结果之列。


                                                                       图 (四)

接下来,也许你希望显出所有员工的信息,不管他是不是有老板,即如果有就显示出来,没有就空着。

于是我想到了用LEFT OUTER JOIN语句。当 表A LEFT OUTER JOIN 表B 时,表A中的所有记录会显示出来,包括满足匹配条件与不满足匹配条件的记录。于是重新得到了14个员工的信息,如下图所示。

它与图一的区别是MGR字体显示的是姓名,而不是编号。

需要注意的是,做左外连接时,应根据所要求查询的信息来安排两个表在"LEFT OUTER JOIN"两边的位置。


                                                                   图 (五)

等价于下图的查询方式,注意(+)的位置:


                                                               图 (六)

图五、图六解决的问题是,把所有员工及其老板的名字(如果有的话)显示出来,包括没有老板编号,或编号不在员工编号范围的员工记录,我们现在关心的是BOSS值为空的员工。图一告诉我们,员工总人数是14个,但是这14位员工并不都有属下。下面你可能会要求我把所有的老板列出来,不管他有没有属下,如果有就列出来,没有就空着。这么做似乎毫无意义,实际上是换角度看问题,此时我们关注的是ENAME为空的BOSS。右外连接能帮我们解决这个问题。以下是右外连接RIGHT OUTER JOIN及其等价的查询结果,记录条数为20条。需要注意的是做连接的表的位置关系。


                                                                 图 (七)


                                                               图 (八)

最后一个FULL OUTER JOIN就是把LEFT OUTER JOIN与RIGHT OUTER JOIN结合起来,查询来自做连接的两表中满足匹配条件和不满足匹配条件的记录,获得记录条数相对而言也是最多的。查询结果如下图所示:


                                                                图 (九)

 

实例(二)

A表和B表的id列含义相同。现要求对比A、B表中id相同的记录的colC和colD字段的值的变化情况,以及A、B表中id不同的记录的colC和colD字段的值。

将A、 B表中的记录导入数据库Microsoft Access,写一个全外连接语句

select A.id, B.id, A.colC, B.colC, A.colD, B.colD from A left join B on A.id=B.id
UNION select A.id, B.id, A.colC, B.colC, A.colD, B.colD from A right join B on A.id=B.id;

posted on 2007-09-22 01:10  jcsu  阅读(1920)  评论(0)    收藏  举报