oracle左右连接相关

来源:互联网 发布:天龙八部 lua源码hook 编辑:程序博客网 时间:2024/04/29 18:16
2010-08-06

内连接,外连接,交叉连接

文章分类:JavaEye

探究内连接,外连接,交叉连接
(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
内连接分三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
使用等值连接,,在选择列表中列出LandTbl和TownTbl表中重复列(TownCode):
例:Select * from LandTbl as A inner join TownTbl as B on A.TownCode=B.TownCode
2、不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。
这些运算符包括>、>=、<=、<、!>、!<和<>。
例:Select * from LandTbl as A inner join TownTbl as B on A.TownCode<>B.TownCode
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
使用自然连接,在选择列表中删除LandTbl和TownTbl表中重复列(TownCode):
Select A.*, B.CityCode, B.TownName from LandTbl as A inner join TownTbl as B on A.TownCode=B.TownCode

(二)外连接

内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
左外连接,显示符全条件的数据行及左边数据表中不符合条件的数据行
例:
Select A.*, B.CityCode, B.TownName from LandTbl as A left (OUTER) join TownTbl as B on A.TownCode=B.TownCode
右外连接,显示符全条件的数据行及右边数据表中不符合条件的数据行
例:
Select A.*, B.CityCode, B.TownName from LandTbl as A right (OUTER) join TownTbl as B on A.TownCode=B.TownCode
全外连接,显示符全条件的数据行及左边和右边数据表中不符合条件的数据行
例:
Select A.*, B.CityCode, B.TownName from LandTbl as A full (OUTER) join TownTbl as B on A.TownCode=B.TownCode
(三)交叉连接

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
select A.*, B.CityCode, B.TownName from LandTbl cross join TownTbl

 (-^_^-)


 附(供參考):

表TownTbl
栏位名称      中文描述   
CityCode     县市代码   
TownCode   乡镇代码   
TownName  乡镇名称   
 
表LandTbl
栏位名称       中文描述   
LandCode   土地代号   
LandName  土地名称   
LandQty       土地面积        
TownCode  乡镇代码   
Type             土地类别

***********************************************************************

SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)

最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想~
现在在这写写关于它们的作用
假设有如下表:


一个为投票主表,一个为投票者信息表~记录投票人IP及对应投票类型,左右连接实际说是我们联合查询的结果以哪个表为准~
1:如右接连 right join 或 right outer join:

我们以右边voter表为准,则左表(voteMaster)中的记录只有当其ID在右边(voter)中存在时才会显示出来,如上图,左边中ID为3.4.5.6因为这些ID右表中没有相应记录,所以没有显示!
2:因此我们自然能理解左连接 left join 或者 left outer join

可见,现在右边中ID在中存在时才会显示,当右边中没有相应数据时则用NULL代替!
3:全连接 full join 或者 full outer join,为二个表中的数据都出来,这里演示效果与上一样!
4:内连接 inner join 或者 join;它为返回字段ID同时存在于表voteMaster 和 voter中的记录

5:交叉连接(完全连接)cross join 不带 where 条件的
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生6*3=18条记录)

等价select vm.id,vm.voteTitle,vt.ip from voteMaster as vm,voter as vt

6:自连接。在这里我用我前段时间一个电力项目中的例子(改造过)
如下表:

这是一个部门表,里面存放了部门及其上级部门,但都放在同一张表中,我们假设现在需要用SQL查询出各部门及其上级部门!就如何做,
当然,不用自连接也一样,可以如下:

我们达到预期目的!在这个查询中使用了一个子查询完成对上级部门名的查询,如果使用自连接,那么结构上感觉会清晰很多。

是不是也同样完成了功能呢,这里除了使用自连接,还使用了左连接,因为省电力没有上级部门,他是老大,如果使用内连接,就会把这条记录过滤掉,因为没有和他匹配的上级部门。
自连接用的比较多的就是对权形结构的查询!类似上表!

原创粉丝点击