当前位置:学学看123知识中心电脑教学数据库教程四种链接的区别及用法» 正文

四种链接的区别及用法

[06-11 18:16:48]   来源:http://www.xxk123.com  数据库教程   阅读:8800

导读:2、右链接:和左链接一样,只不过为"主"的一方调过来了,换成是由右边做"主"。3、内链接:和左、右链接不同,它一定要左、右两边都有的记录才会放进结果,如果有某个记录不存在于任何一边,那这个记录是不会出现在结果中去的。4、外链接:跟内联接相,反,相当于左、右链接的合并:不管什么情况,只要某个记录出现在这两个表,就一定会出现在结果中去,然后象左、右链接的处理方法一样,用Null来填充没有对应值的字段。注:以上说的"有"、"没有",意思是以titles.ph=publishers.ph为判断标准来下决定的。比如当前titles表的ph是"002",而在publishers中,没有一个记录的ph的值是"002"的,所以就说"002"这个值在titles有,在publisher中没有,这样titles.ph为"002"的记录就会被选中,最后放在结果中去。大家如果想一下,这个on的作用跟where、having似乎有点类

四种链接的区别及用法,标签:sql数据库教程,access数据库教程,http://www.xxk123.com

2、右链接:和左链接一样,只不过为"主"的一方调过来了,换成是由右边做"主"。

3、内链接:和左、右链接不同,它一定要左、右两边都有的记录才会放进结果,如果有某个记录不存在于任何一边,那这个记录是不会出现在结果中去的。

4、外链接:跟内联接相,反,相当于左、右链接的合并:不管什么情况,只要某个记录出现在这两个表,就一定会出现在结果中去,然后象左、右链接的处理方法一样,用Null来填充没有对应值的字段。

注:以上说的"有"、"没有",意思是以titles.ph=publishers.ph为判断标准来下决定的。比如当前titles表的ph是"002",而在publishers中,没有一个记录的ph的值是"002"的,所以就说"002"这个值在titles有,在publisher中没有,这样titles.ph为"002"的记录就会被选中,最后放在结果中去。

大家如果想一下,这个on的作用跟where、having似乎有点类似,都是起到过滤的作用:根据条件选取所取的记录,而根据命令的工作流程,这个on是比where、having都要早执行的,而它里面的条件表达式又不一定是titles.ph=publishers.ph的形式,还可以继续扩充,变成一个很复杂的条件表达式,从而完成一个很有效的、where和having都不能实现的过滤功能。具体的比较请看 on、where、having的区别 一节。

刚才举的例子,表中的ph都是没有重复的。现在以内联接为例,举个判断字段中内容有重复的例子:

Temp1temp2Aaaa11122232
sele temp1.aa,temp2.aa ;  from temp1 join temp2 ;    on temp1.aa=temp2.aa

运行结果是:

1111222222

很明显,有些记录重复了几遍。temp1.aa中的虽然只有1个2,但temp2.aa有3个2,所以结果就会有1*3=3个2了。如果temp1.aa而2个2的话,那结果就会有2*3=6个2了。

知道了这一点,在做多表链接查询的时候很有用。你要考虑第一、二个链接后的结果跟第三个表链接时,会不会出现这种情况?如果有,那是不是你想要的?如果有,那怎么处理?有些朋友说做这个命令的结果中有些记录会比正确的结果大几倍,就要看看是不是出现了这种重复算的情况。

学会了链接,在开始做之前,先要说一个很重要的问题:在视图设计器来看多个表的联接关系,它们之间的链接是用一条线连接起来的,看起来就象一串糖葫芦。如果一个表同时和三个表联接,那看起来就象一支分叉的树枝了,那这种情况结果就不对了。大家可能不明白我在说什么,我举个例子大家就会明白了。

有一个产品表、一个进货明细表、一个出货明细表,现在的要求是要求产品表中所有的产品的进、出情况,也就是把三个表象join命令那样合成一个表,如果没有相应的进、出记录,也照样列出来但不计较null值。刚开始学的朋友很可就会这样做:

1、 在设计器里添加这三个表;

2、 然后用产品表中的产品编号分别与其它二个表左链接,这样产品表中就有二个链接(也就是二条线了);

3、 然后把三个表的字段都做为输出字段。

但结果呢?不对。只有一个表的记录出现在结果中,即使把四种链接类型都试一下,结果都是不对的。

为什么呢?我估计是以下原因:如果产品表只与进货表链接的话,系统根据产品表和进货表的联接关系,以产品表为左表,和进货这个右表组成一个临时结果,然后又以临时表为左表,再去找进货表的右边表。而进货表的右边没有表,这时系统就停止链接,交给where去过滤了。但现在产品表同时跟二个表左联接,系统会自动选其中一个先进行链接,链接结果出来后,这个临时结果的右边就没有表了,系统就停止链接动作了。剩下的出货表、退货表都还没链接,所以那个表等于没用。

解决的方法是:进货表用进货表的产品编号全链接产品表,然后产品表又用产品表的产品编号全链接出货表,进、货表的顺序可以调过来,但产品表一定要在中间,且两个链接类型都是全链接,否则结果都不对。这样的链接情况,在设计器里按链接中的各个表的左右顺序排起来,很直观的:就是一串!没有分叉。这个方法的实现过程就是:

进货表全链接产品表,即使某种产品没有进货,但得出来的结果也一样有这个记录,只是它的进货内容是null值。然后这个临时结果又跟出货表全链接,这次的结果就前一步差不多,有出货内容的记录就有出货数量,否则就是null值。因为没有分叉,所以全部表都链接进去了,结果也就对了(当然如果链接类型错了,结果也是不对的)。

上一页  [1] [2] [3]  下一页


Tag:数据库教程sql数据库教程,access数据库教程电脑教学 - 数据库教程
《四种链接的区别及用法》相关文章

Copyright 学学看123 All Right Reserved.

1 2 3 4 5 6 7 8 9 10