转载于:http://www.2cto.com/database/201206/137067.html
Sql server left join,right join和inner join的比较
今天来研究一下
数据库left join 、right join 和 inner join 这三者之间的区别
在网上看别人的写过的源代码,绝大多数的应用
系统开发,数据库都会有很多的各种各样的join,那些个表table之间join的让人眼花缭乱的,其实一直都是一知半解的状态,
因为在公司上班也不用自己去写SQL代码(我这里是指稍微大一点的正规软件公司,很小小公司还是要自己写sql的),因为公司有专门的DBA,通常都是DBA他们写好了,直接给我们存储过程的名字让我们去调用,
(下次说存储过程吧,这是个非常重要的东西,几乎都会用到,就像我们做ASP.NET开发一定要知道ADO.NET一样,存储过程这种预编译的SQL脚本对开发是很有好处的,我想在传智播客杨老师的基础视频当中只所以会在页面层代码里面直接写sql查询语句,应该是为了方便教学,节约时间吧)
废话不多说,开始学习
这里先给出一个官方的解释:
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
是不是看的有点晕,那下面我们就自己试验吧
第一步:建库建表的过程我就省略了,
因为昨天的测试有一些简单的代码,就直接在上面稍做修改进行测试,下面插入一点测试数据
[sql]
Insert into Table1 values (1,‘姚羽‘)
Insert into Table1 values (2,‘边兵兵‘)
Insert into Table1 values (3,‘袁磊‘)
Insert into Table1 values (5,‘传智博客‘)
Insert into Table2 values (1,‘姚羽‘)
Insert into Table2 values (2,‘柳春平‘)
Insert into Table2 values (3,‘张永超‘)
Insert into Table2 values (4,‘刘华健‘)
[sql]
Insert into Table1 values (1,‘姚羽‘)
Insert into Table1 values (2,‘边兵兵‘)
Insert into Table1 values (3,‘袁磊‘)
Insert into Table1 values (5,‘传智博客‘)
Insert into Table2 values (1,‘姚羽‘)
Insert into Table2 values (2,‘柳春平‘)
Insert into Table2 values (3,‘张永超‘)
Insert into Table2 values (4,‘刘华健‘)
查询出原表的数据如下:
我们对比两个table 发现,Table1 中的数据编号分别为1、2、3、5,而Table12中的数据编号分别为1、2、3、4,也就是说两个表中,只有最后一条数据不一样,分别为Table1中id为5的“传智播客”和Table2中id为4的“刘华健”是对应不上的。
好,我们继续...
第二步:执行left join 的效果
[sql]
Select * from Table1 A
Left join Table2 B
on A.id = B.id
[sql]
Select * from Table1 A
Left join Table2 B
on A.id = B.id
(所影响的行数为 4 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.id = B.id).
B表记录不足的地方均为NULL.
第三步:执行right join 的效果
[sql]
Select * from Table1 A
right join Table2 B
on A.id = B.id
[sql]
Select * from Table1 A
right join Table2 B
on A.id = B.id
(所影响的行数也为 4 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
第四步:执行inner join 的效果
[sql]
Select * from Table1 A
inner join Table2 B
on A.id = B.id
[sql]
Select * from Table1 A
inner join Table2 B
on A.id = B.id
结果说明:
很明显,这里只显示出了 A.id = B.id的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
好了,到此为止,总算弄清楚这两者之间的区别了,
数据库是软件开发的核心和基础,一定要学好。