梦里”连接”知多少:多表查询之内连接 VS 外连接
在实际项目中对数据库进行查询是再常见不过的东西了,但是根据不同的条件查询所用的语句也是千差万别的,最常见的便是数据库中多表之间的联合查询。说到联合查询就不得不提一下查询语句中的表连接关系。我们所用的多表查询语句中表间关系无非有两种,一种为内连接(inner join),另一种为外连接(outer join)。具体细分一下外连接又可分为:左外连接(left join)、右外连接(right join)、全连接(full join),另外还常见的形式有left outer join,right outer join,full outer join。他们之间的具体关系可以下图简单表示:
最近在做系统的过程中用到了不同的查询方式,这里简单总结一下:
首先要说明的是外连接中outer与非outer之间的关系。很多人都使用过left outer join或者是left join,但是多数人没有想过这两者之间究竟有没有区别。很不幸的告诉大家left outer join和left join之间其实是没有本质区别的,outer只是left join的一个属性,outer的存在只是显示的给出了left join的属性,如果没有的话默认的属性也是为outer的,他们两个在查询结果的实现上是没有区别的,right join与right outer join以及full join与full outer join之间的关系也是如此,所以在此我们只介绍inner join、left join、right join和full join四种关系即可。
一、对比理解inner join和 full join
对这两个连接关系的理解我们可以借助于数学上的交并集。Inner join也就是内连接,要求的是多表之间必须同时都满足两表之间的对接条件才能查出结果,也就是说按照对接关系(即on条件)查出的结果必须是多表之间的交集,不满足on条件将会被过滤掉,可以理解为数学上的add条件。Out join与inner join却恰恰相反,它所查出来的结果是两表各自按条件查询结果的并集,outer join的存在,相当于数学上的or条件。
二、对比理解left join和right join
Left join和right join最大的区别在于它确定了以哪个表为查询结果基准。Left join确定以左边表为基准,也就是join字符前的那张表,而right join确定以右边表为基准,即join字符后的那张表。进行查询时首先按照基准表的查询结果确定记录条数然后再根据条件查询非基准表。具体用法以下例说明:
表一:TableOne(别名为TO)
ID
A
B
C
1
A1
B1
C1
2
A2
B2
C2
3
A3
B3
C3
表二:TableTwo(别名为TT)
ID
D
E
1
D1
E1
2
D2
E2
4
D4
E4
请注意两表中的ID号的区别。
Inner join:
Select TO.A , TO.B , TT.D , TT.E fromTableOne TO inner join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A
B
D
E
A1
B1
D1
E1
A2
B2
D2
E2
Left join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO left join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A
B
D
E
A1
B1
D1
E1
A2
B2
D2
E2
A3
B3
NULL
NULL
Right join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO right join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A
B
D
E
A1
B1
D1
E1
A2
B2
D2
E2
NULL
NULL
D4
E4
Full join:
Select TO.A , TO.B , TT.D ,TT.E fromTableOne TO full join TableTwo TT on TO.ID=TT.ID
其查询结果为:
A
B
D
E
A1
B1
D1
E1
A2
B2
D2
E2
A3
B3
NULL
NULL
NULL
NULL
D4
E4
- 41楼haixianshichang53分钟前
- 你写的只是两张表,那如果有两张以上的表怎么实现多表查询
- Re: a1314517love52分钟前
- 回复haixianshichangn多张表的查询跟两张表的查询很类似,比如说:select T1.[name],T2.name1 ,T3.name2 from Table1 T1 inner join Table2 T2 on T1.id=T2.id inner join Table3 T3 on T3.id=T2.id where T3.IsAddmin='是'
- 40楼xiaoduishenghuogo4小时前
- 简单明了,学习了!
- Re: a1314517love1小时前
- 回复xiaoduishenghuogon互相学习,哈哈
- 39楼yaofushan5小时前
- 呵呵,学习了!!!
- Re: a1314517love4小时前
- 回复yaofushann互相学习....
- 38楼lbq6136136小时前
- Very Good!!!
- Re: a1314517love6小时前
- 回复lbq613613n又撞衫了,哈哈....
- 37楼yangmadao7小时前
- 多表查询为什么不用视图???
- Re: a1314517love6小时前
- 回复yangmadaon可以用视图,但是我觉得多表查询更灵活一点
- 36楼imokyou7小时前
- 我以为有多高深,原来是把书上的东西照搬过来.难得还有这么多人'学习了'
- Re: a1314517love7小时前
- 回复imokyoun兄弟见笑了,小弟本来就不高深,正在虚心学习之中,说道书上的东西就不太靠谱了,我们学习很少用书的,难道我的博客中有和书上的东西一样吗,那真是荣幸呵呵!不过我很疑惑的是难道对书上的知识进行理解总结然后放在博客上有什么不对吗,博客本身不就是一个互相交流学习的平台吗,我不清楚兄弟为什么这么鄙视书上的东西,如果兄弟能把自己看到的书上的知识放在博客上供大家交流那就太好了,你看过的书不一定是我看过的,通过你的博客我就又可以多看一本书了呵呵
- 35楼jnqqls昨天 22:55
- 写的不错,图文并茂.需要在实战中进一步理解.
- Re: a1314517love7小时前
- 回复jnqqlsn嗯,知道了师哥
- Re: a1314517love昨天 22:46
- 回复oiuytrdetfn我也想不太懂,你为什么会对我的文章做出这样风马牛不相及的评论,呵呵,不过还是谢谢光临
- 33楼lishehe昨天 21:27
- 顶了,呵呵加油师哥向你们学习
- Re: a1314517love昨天 21:28
- 回复lishehen加油,你们会更棒的
- 32楼dongyafeihuang昨天 21:08
- 例子很容易让人明白
- Re: a1314517love昨天 21:27
- 回复dongyafeihuangn谢谢...
- 31楼wangxuhebeibd昨天 19:13
- 顶 一个了。写的真好。
- Re: a1314517love昨天 19:14
- 回复wangxuhebeibdn谢谢...
- 30楼wangyongxia921昨天 15:54
- 很火哎,我也来了!
- Re: a1314517love昨天 19:05
- 回复wangyongxia921n欢迎美女,呵呵...
- 29楼madStone_l昨天 14:23
- 似乎少了个,CROSS JOIN 的介绍。
- Re: a1314517love昨天 15:14
- 回复madStone_ln我还真没用过cross join,兄弟见笑了
- 28楼StubbornPotatoes昨天 11:35
- 优化的重要方式之一。
- Re: a1314517love昨天 14:22
- 回复StubbornPotatoesn是啊,与数据库范式相对应
- 27楼xqf309昨天 10:50
- 深刻,学习了
- Re: a1314517love昨天 11:11
- 回复xqf309n互相学习....
- 26楼nanshangongyuan昨天 10:49
- 那几个表格能在长点吗,看着别扭
- Re: a1314517love昨天 10:50
- 回复nanshangongyuann在word中做好表后粘到博客上就成这样了,我也挺郁闷的,有什么解决办法吗?
- 25楼ccxcccx昨天 10:42
- 楼主还忽略了一个:nSelect TO.A , TO.B , TT.D ,TT.E fromTableOne TO,TableTwo TT where TO.ID=TT.IDn如果是这样会是怎么样呢?
- Re: a1314517love昨天 10:48
- 回复ccxcccx既然加了where 条件限制,那当然是必须满足where后面的条件的,兄弟可以在SQL Server中做个下例子测试一下,结果说明一切...
- 24楼liujiahan629629昨天 10:12
- 收哥,厉害!
- Re: a1314517love昨天 10:23
- 回复liujiahan629629n过奖了,过奖了呵呵
- 23楼wwwwenhuan昨天 09:07
- 很详细,温欢
- Re: a1314517love昨天 09:18
- 回复wwwwenhuann欧了...
- 22楼penglaidao昨天 09:06
- LZ总结的不错,但是表达的让人越看越糊涂
- Re: a1314517love昨天 09:07
- 回复penglaidaon兄弟能不能把哪里不明白指出来,我好改正一下
- 21楼hejingyuan6昨天 09:06
- 学习了
- Re: a1314517love昨天 09:06
- 回复hejingyuan6n互相学习...
- 20楼beijiguangyong昨天 09:04
- 连接和视图是什么关系呢?连接有哪些优缺点呢?
- Re: a1314517love昨天 09:06
- 回复beijiguangyongn连接和查询的区别我觉得主要有两点:第一是储存形式上,视图是写死在数据库中的,他在创建的时候作为数据库的一部分存储在数据库中,而查询(这里指外部传入的sql语句不包括存储过程和触发器)是通过外部传入的,视图在数据库中创建后就存储在数据库中断电后也不会消失,而查询语句查出的结果虽然也是以视图的形式存在的但是他是一张虚拟的视图,断电后就会消失。。第二是功能灵活性上,视图由于在创建的时候就已经固定了格式,所以对视图的查看只局限在创建视图时所用的那几张固定的表,而连接由于是外部传入的所以具有很大的灵活性,可以实现对N张表的动态查询。nn总结:n二者关系:视图是数据库中实际存在的一个对象,而连接查询结果也是以视图形式存在的只不过是虚拟视图。n连接优点:连接在使用时具有更大的灵活性,可以实现对任意张表的任意字段的动态查询。视图则很具有局限性。nn不知道这样理解对不对?
- 19楼sxyandapp昨天 09:03
- 其实这就是两个表的乘法,软考里有讲
- Re: a1314517love昨天 09:03
- 回复sxyandappn看来我还需要进一步学习...
- 18楼laner0515昨天 09:03
- very good!
- Re: a1314517love昨天 09:03
- 回复laner0515n谢谢小美女,哈哈
- 17楼llhhyy1989昨天 09:01
- 呵呵,分析很详细。在性能优化中也能用到哈
- Re: a1314517love昨天 09:02
- 回复llhhyy1989n还得继续学习,听说软考中还有涉及,鸭梨大啊...
- 16楼Wentasy昨天 09:01
- 不错!
- Re: a1314517love昨天 09:01
- 回复Wentasyn谢谢...
- 15楼gwblue昨天 09:00
- 机房收费系统有些时候就要用这个!受教了!
- Re: a1314517love昨天 09:00
- 回复gwbluen是的,多表查询有很多地方会用到,也可以试试用视图,视图也很好用的
- 14楼ziyibei昨天 08:59
- 后边的例子足以说明一切了,前面太罗嗦了
- Re: a1314517love昨天 08:59
- 回复ziyibein也许是我自认为说的比较详细了吧呵呵
- 13楼leimengyuanlian昨天 08:50
- 深奥...
- Re: a1314517love昨天 08:57
- 回复leimengyuanliann以后就不深奥了..
- 12楼yantaifuge昨天 08:49
- 强...
- Re: a1314517love昨天 08:50
- 回复yantaifugen谢谢
- 11楼liutengteng130昨天 08:37
- 支持[e01]
- Re: a1314517love昨天 08:49
- 回复liutengteng130n谢谢美女
- 10楼zhangyingjie09昨天 08:31
- 学习
- Re: a1314517love昨天 08:35
- 回复zhangyingjie09n互相学习...
- 9楼sunliduan昨天 08:29
- 名字很好的!
- Re: a1314517love昨天 08:31
- 回复sunliduann谢谢小美女...
- 8楼haibingongyuan昨天 08:24
- 不错,不错...
- Re: a1314517love昨天 08:25
- 回复haibingongyuann谢谢...
- 7楼xvshu昨天 08:22
- 向师哥致敬
- Re: a1314517love昨天 08:23
- 回复xvshun我们是兄弟
- 6楼akkzhjj昨天 08:18
- 顶!
- Re: a1314517love昨天 08:20
- 回复akkzhjjn欧了....
- 5楼zhanglianhai555昨天 08:18
- 图文并茂,帅气!
- Re: a1314517love昨天 08:18
- 回复zhanglianhai555n海哥给力...
- 4楼han_yankun2009昨天 08:14
- 细腻
- Re: a1314517love昨天 08:17
- 回复han_yankun2009n谢谢...
- 3楼xjc1278003262昨天 08:11
- 思维导图,再画的完美些就好啦!n自考课,米老师教的画思维导图准则。
- Re: a1314517love昨天 08:12
- 回复xjc1278003262n嗯,有道理,当时觉得内容不是很多就简单的画了画,长收
- 2楼qibingliandui昨天 08:10
- 题目很吸引人,内容有很多地方嗦
- Re: a1314517love昨天 08:10
- 回复qibinglianduin好的,以后改进
- 1楼ZHENGYU2099昨天 08:07
- 写的挺好的
- Re: a1314517love昨天 08:08
- 回复ZHENGYU2099n谢谢...