java join()用法_四种联系(join)的区别及用法

链接:

作为动词,它表示将两个或多个表的内容结合在一起并产生一个结果集,该结果集对每个表的列和行进行合并。表的联接一般都使用它们共有的数据。例如,您可以对有一个共同 pub_id 列的 titles 表和 publishers 表联接,产生一个包含书名信息和出版商信息的结果集。

作为名词,表示对表进行联接的过程或结果,如在术语"内部联接"中表示对表联接的一种特殊的方法。

联接条件(join condition)

一个比较子句,它指定了表是如何通过它们的联接字段相联系的。最普通的联接条件是相等(一个等联接),在等联接中联接字段的值必须相同。例如,您可以通过在 titles 表和 publishers 表的 pub_id 列中查找相匹配的值联接这两个表。然而,任何比较运算符都可以是比较条件的一部分。

内部联接(inner join)

一个联接,在该联接中只有当联接字段的值满足某些特定的准则时才将两个表的记录进行结合并添加到一个查询结果中。例如,在查询设计器视图中,表之间的缺省联接是一个内部联接,它只有当联接字段的值相等时才从两个表中选择记录。

外部联接(outer join)

一个联接,该联接还包括那些和联接表中记录不相关的记录。您可以创建一个外部联接的三种变形来指定所包括的不匹配行:左外部联接、右外部联接和完全外部联接。

左外部联接(left outer join)

一种外部联接类型,在该联接中包括第一个命名表(左边的表,它出现在 JOIN 子句的最左边)的所有行。右边表中没有匹配的行不出现。例如,您可以在 titles 表和 publishers 表之间创建一个左外部联接,以包括所有的书名,不论书名有无出版商的信息。

右外部联接(right outer join)

一种外部联接,在该联接中包括第二个命名表(右边的表,出现在 JOIN 子句中的最右边)的所有行。不包括左边表中没有匹配的行。例如,titles 表和 publishers 表之间的一个右外部联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。

以上是MSDN中对链接的定义。现在我们就从这四种链接所使用的不同方法来看他们的结果有什么不同。

titles 表sh(书号)ph(出版商编号)232342001043200382478123005

publishers 表

ph(出版商编号) mc(出版商名称)

001 红虎

002 rmh

003 hazl

现要把这两个表的内容合成如下的表结构:

sh(书号) ph(出版商编号) mc(出版商名称)

现在看看采用四种链接方法的结果会有什么不同。先说说他们的命令:

内联接:

sele titles.sh,publishers.ph,publishers.mc ;

from titles inner join publishers ;    &&内联接中的inner是可以省略的

on titles.ph=publishers.ph

外联接:

sele titles.sh,publishers.ph,publishers.mc ;

from titles outer join publishers ;

on titles.ph=publishers.ph

左联接:

sele titles.sh,publishers.ph,publishers.mc ;

from titles left join publishers ;

on titles.ph=publishers.ph

右联接:

sele titles.sh,publishers.ph,publishers.mc ;

from titles right join publishers ;

on titles.ph=publishers.ph

大家可能看到,除了在join之前的那个关键字不同之外,其他地方是一模一样的,链接条件(即on那一部分)也是一样的。结果:

内链接:

232342001红虎0432003hazl

全链接:

232342001001红虎NullNull002rmh0432003003hazl82478123005NullNull

左链接:

232342001001红虎0432003003hazl82478123005NullNull

右链接:

232342001001红虎NullNull002rmh0432003003hazl

所以我们很容易记住:

1、左链接:就是以join的左边那个表为"主",以titles.ph=publishers.ph为判断标准,不管右边的表有没有对应的记录,都要把左边表的记录放在结果中去,但右边表没有相应的记录那应该放个什么数值进去?答案是就放个Null,表示没有。在左链接中,某记录在右边表,却不在左边表,那是不放进去结果去的,原因是左边表才是"主",要不要放由它决定:它有的,就一定放进去,它没有的,就不要了。

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值。因为没有分叉,所以全部表都链接进去了,结果也就对了(当然如果链接类型错了,结果也是不对的)。

看了刚才那个问题之后,还有一个问题也要说一下。在刚才那个例子中,如果产品表中某个产品编号出现了重复,有N个记录的编号相同,而在进货表里这个编号的记录也出现M个,这样一来,结果就有点不同了。首先在进货表跟产品表的全链接结果里,这个编号就会出现N*M次,就不是一次了。然后这个临时表再去跟出货表全链接时,即使这个编号在出货表里出现一次,但在最后的链接结果中,这个编号还是会出现N*M次,那它的出货记录也重复了N*M次了。如果现在要sum()出货记录的话,那出货数量就会放大了N*M倍了,进货记录也不准了。所以如果产品表中的编号有重复的话,那结果就很可能会不对了。

但产品表的编号没有重复,那结果就一定会正确呢?也未必。大家试一下,假设进货表和产品表的编号"001"都是只出现一次,但出货表中就出现了二次。那最后的结果中"001"还是出现了二次,二次的产品名称、进货数量都是相同的,只是出货数量不同而已。如果这时sum(),结果还是不对。

所以如果想在多表链接后进行sum()之类的汇总操作,使用以上的方法是不行的。解决方法是使用union,用它来将进货的汇总情况跟出货的汇总情况合起来,从而避免互相干扰。

另注:3个表之间的连接

eg:      select a.* b.field1,c.field2 from table a left outer jion table b on a,field1=b.field1 left outer join table c on a.field2=c.field2

posted on 2007-02-09 12:00 小辞猬 阅读(288) 评论(0)  编辑  收藏 所属分类: DataBase

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python无效的类字符串_Python基础-字符串处理

​你好,我是goldsunC让我们一起进步吧!字符串操作与处理字符串是编程语言中经常会遇见的东西,而字符串又和那些编程语句什么的不太一样,我们可能需要对一个字符串进行各种各样的处理,后面我将给出我整理的一些常用的对…

phpstorm xdebug配置

phpstorm 8.0.3版本 1.本身自带xdebug插件 2.在xampp的php.ini中最后中添加(如果有[XDebug]配置替换) [XDebug]zend_extension "D:\Program Files\xampp\php\ext\php_xdebug.dll";xdebug.profiler_append 0;xdebug.profiler_enable 1;xdebu…

php xml 返回 微信,php版微信返回用户text输入的方法

本文实例讲述了php版微信返回用户text输入的方法。分享给大家供大家参考,具体如下:获得用户输入的内容,并发回相同内容//获取post数据// $PostData $HTTP_RAW_POST_DATA;$PostData file_get_contents("php://input");//判断POST是…

python加密敏感信息_仅需10行代码,使用python加密用户敏感数据

原标题:仅需10行代码,使用python加密用户敏感数据数据分析师必须要遵守的一个规则就是数据保密,但在跨部门沟通的时候,难免会有数据泄露的情况,所以,对于用户的姓名、手机号、地址等敏感信息,一…

springmvc+ztree v3实现类似表单回显功能

在做权限管理系统时,可能会用到插件zTree v3,这是一个功能丰富强大的前端插件,应用很广泛,如异步加载菜单制作、下拉选择、权限分配等。在集成SpringMVC中,我分别实现了zTree的添删改查,本节主要实现类似表单回显功能。…

php数组基础知识,PHP 数组基础知识小结

php函数有很多,需要时查询api。/*#数组 没有限制大小:$arr[0]1;$arr[1]2; $arrarray("0","1");$list($num1,$num2)$arr;array range(int low,int high[,int step])low最小数,high最高数,step步长int array_unshift(array…

python通过跳板机连接服务器_使用pycharm、跳板机连接内网服务器

使用pycharm、跳板机连接内网服务器接手实验室服务器后,大部分同学在GPU集群上跑程序都是直接在ssh界面上跑,这里想着通过pycharm通过跳板机来连接服务器。总体就是实验室服务器仅限内网访问,同时实验室也提供了一个跳板机,可以先…

C语言事实上不简单:sizeof

问&#xff1a;C语言中一共同拥有多少个keyword&#xff1f; 答&#xff1a;32个。 答不上来的没关系。非常正常。我们玩的是程序的艺术。而不是背数字。只是这个特殊的数字1<<5也是非常好记的-.-。 问&#xff1a;sizeof是函数还是keyword&#xff1f; 第一次看到这个问…

php的可变函数,php之可变函数的实例详解

php之可变函数的实例详解php的可变函数&#xff0c;今天大概的了解下&#xff0c;是看php手册总结的&#xff0c;觉得用处不大&#xff1b;PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号&#xff0c;PHP 将寻找与变量的值同名的函数&#xff0c;并且尝试执行它。可…

Android应用安全开发之浅谈网页打开APP

一、网页打开APP简介 Android有一个特性&#xff0c;可以通过点击网页内的某个链接打开APP&#xff0c;或者在其他APP中通过点击某个链接打开另外一个APP&#xff08;AppLink&#xff09;&#xff0c;一些用户量比较大的APP&#xff0c;已经通过发布其AppLink SDK&#xff0c;开…

python history文件_【python之路19】文件操作

一、打开文件文件句柄 open(文件路径, 模式)打开文件时&#xff0c;需要指定文件路径和以何等方式打开文件&#xff0c;打开后&#xff0c;即可获取该文件句柄&#xff0c;日后通过此文件句柄对该文件操作。打开文件的模式有&#xff1a;r &#xff0c;只读模式【默认】w&…

php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...

发布图片最多可添加9张作品发布wx.config({debug: false,appId: {$signPackage["appid"]},timestamp: {$signPackage["timestamp"]},nonceStr: {$signPackage["noncestr"]},signature: {$signPackage["signature"]},jsApiList: [// 所…

2、在控制台上输出1—100数字

public class Test {// 定义类 public static void main(String[] args) {// 主函数&#xff0c;程序的入口 for (int i 1; i < 100; i) { System.out.print(i " "); } }}转载于:htt…

vue防抖和节流是什么_JavaScript防抖与节流,你知道多少?

JavaScript 的节流和防抖已经是老生畅谈的问题了&#xff0c;对于前端行业技术大牛来讲不过是小菜一碟&#xff0c;而对于绝大多数前端小白或初级工程师&#xff0c;绝对是必备的知识&#xff0c;值得学习。接下来小郭就带大家一起学习“防抖”与“节流”。防抖不知道大家第一次…

php中循环跳过,php for循环的exit / break / continue /goto 停止、跳过循环、继续循环...

php 与 JavaScript 有很多相似的地方&#xff1b; for循环中也有两个相同&#xff1b; 只是 php 比 js 多了一个 exit &#xff0c; 其他用法一样&#xff1b;for($i 1;$i<11;$i){if($i3){// exit; //当$i 3 代码停止运行&#xff0c;包括循环外的&#xff0c;后面的也停止运…

checkbox:全选与反全选

$(document).ready(function () {//全选checkbox$("#selectAll").click(function () {var checked $(this).prop("checked");$(":checkbox").prop("checked", checked);});$("tbody :checkbox").click(function () {var is…

python连接influxdb_python 访问 InfluxDB 数据库

我们开发了一个基于 TelegrapgInfluxDBchonographkapacitor 的气象站监控演示系统。通过modular-2 连接了一个气象站传感器&#xff0c;采集温度&#xff0c;湿度&#xff0c;PM2.5&#xff0c;PM1.0 &#xff0c;照度&#xff0c;大气压等参数。通过MQTT 协议传送给Telegraph。…

location php,Nginx服务器中的location配置详解

语法location [|~|~*|^~] /uri/ {...}规则 &#xff1a; 表示精确的URI匹配(有兴趣的同学可以看一下url和uri的区别)&#xff5e;&#xff1a; 表示区分大小写的正则匹配&#xff5e;*&#xff1a;表示不区分大小写的正则匹配!~ && !~*&#xff1a;表示区分大小写不匹…

codevs4203山区建小学

/* 状态&#xff1a;f[i][j] 前i个村庄已经建了j个学校 转移&#xff1a;f[i][j]min&#xff08;f[i][j],f[ii][j-1]s[ii1][i]&#xff09; 1<ii<i-1 */ #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include &l…

gson解析php,php,android_关于 Gson 解析JSON数据。。。,php,android - phpStudy

关于 Gson 解析JSON数据。。。1.首先&#xff0c;我是从服务器端传回来的JSON数据如下&#xff1a;{"info":"succeed","user_id":"1","user_password":"9999","user_email":"95469qq.com",&q…