查看完整版本: [-- [转]在SQL中join、inner join和left join的区别 --]

风信Java论坛 ›› Microsoft SQL Server ›› [转]在SQL中join、inner join和left join的区别 登录 -> 注册

1F [转]在SQL中join、inner join和left join的区别   jastby Post by : 2009-06-11 11:17:27.0

在SQL中join、inner join和left join的区别

这个问题,相信是很多初涉及SQL的用户的疑问。我不是学习计算机的,也不是学习数据库或编程的,想当初看到有些地方用join,有些地方用inner join,有些地方又用left join或right join,也是很想不明白,不知道有什么区别。在咨询同事的后,大致明白了一些,但也不是很明白,后来就自己按照指点的逻辑自己做数据测试,再想想,才想明白其中的道理。现根据个人理解,将它作一简略答复。由于怕放到上述的地址中,哪一天找不到了,故重复在自己的BLOG下。如果还有其他高见,请补充。

一、join 、inner join、left join 之间的关系

1、join=inner join,表示内联系,能查询出来的结果,是在两个表中都同时存在的数据。inner join的语法在以前的SQL版本中才存在,后延继到现在。需要说明的是,在access中必须使用 inner join,access 2000/97 只支持join的用法。其他版本的acccess,则自己根据情况使用。
2、left join,左联接。它是以联接关系中的左外的表为基准,右边的表如果没有数据,则以空值NULL填充。这个联接方法,与把哪一个表放在左边和右边,是有区别的,得到结果也不一样。

二、实例

1 、假定有两个表:(Fnote 字段都为NULL)

1)K_01
Fname  Fnote  Fnumber
Name_01    t1.01
Name_02    t1.02
Name_03    t1.03
Name_04    t1.04

2)K_02
Fname Fnote Fnumber
Name_03    t1.03
Name_04    t1.04
Name_05    t1.05
Name_06    t1.06

2、分别执行以下不同的SQL,得到的结果,将是不同的。

--1)以两表中都共同有的字段为基准,取K_01的全部和K_02的Fnumber
select k_01.*,K_02.fnumber fnumber_k_02 from k_01 join k_02 on k_01.fnumber=k_02.fnumber

--得到的结果:
Fname Fnote Fnumber fnumber_k_02
Name_03 NULL t1.03 t1.03
Name_04 NULL t1.04 t1.04

--2)以两表中都共同有的字段为基准,取K_02全部和K_01的Fnumber
select k_02.*,K_01.fnumber fnumber_k_01from k_01 join k_02 on k_01.fnumber=k_02.fnumber

--得到结果:
Fname Fnote Fnumber fnumber_k_01
Name_03 NULL t1.03 t1.0
Name_04 NULL t1.04 t1.04

--3)01为基准,取K_01的全部和K_02的Fnumber
select k_01.*,K_02.fnumber fnumber_k_02 from k_01 left join k_02 on k_01.fnumber=k_02.fnumber

--得到的结果
Fname Fnote Fnumber fnumber_k_02
Name_01 NULL t1.01 NULL
Name_02 NULL t1.02 NULL
Name_03 NULL t1.03 t1.03
Name_04 NULL t1.04 t1.04

--4)以K_02为基准,取K_02的全部和K_01的FNumber
select k_02.*,K_01.fnumber fnumber_k_01 from k_02 left join k_01 on k_01.fnumber=k_02.fnumber

--得到的结果
Fname Fnote Fnumber fnumber_k_01
Name_03 NULL t1.03 t1.03
Name_04 NULL t1.04 t1.04
Name_05 NULL t1.05 NULL
Name_06 NULL t1.06 NULL

--5)以K_01为基准,取K_02 的全部和K_01的Fnumber
select k_02.*,K_01.fnumber fnumber_k_01 from k_01 left join k_02 on k_01.fnumber=k_02.fnumber

--得到的结果
Fname Fnote Fnumber fnumber_k_01
NULL NULL NULL t1.01
NULL NULL NULL t1.02
Name_03 NULL t1.03 t1.03
Name_04 NULL t1.04 t1.04

三、从上面的实例中,可以看出,当使用join时无论怎么取数,得到的结果都是相同的。但当使用left join取数时,则与哪一个表在左边和右边,直接影响到取数得到的结果。

同样地,right join(右联接)也是同样的道理,请自行测试,并思考其中的规律。

2F    jastby Post by : 2009-06-11 11:18:33.0

left join:左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join:右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
inner join:内连接,又叫等值连接,只返回两个表中连接字段相等的行。
full join:外连接,返回两个表中的行:left join + right join
cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

declare @a table(a int,b int)
declare @b table(a int,b int)

insert @a values(1,1)
insert @a values(2,2)
insert @b values(1,1)
insert @b values(3,3)
select * from @a
select * from @b
--左:
select * from @a Aa left join @b Bb on Aa.a=Bb.a
--右:
select * from @a Aa right join @b Bb on Aa.a=Bb.a
--内
select * from @a Aa inner join @b Bb on Aa.a=Bb.a
--外:
select * from @a Aa full join @b Bb on Aa.a=Bb.a
--交叉连接
select * from @a cross join @b

看了就明白了

left 以左边为准右边有则显示无则NULL
right反之
inner只取都不null的,相当于用from a,b where ?=?(连接是on ? = ?)


风信Java论坛 ›› Microsoft SQL Server ›› [转]在SQL中join、inner join和left join的区别 登录 -> 注册

查看完整版本: [-- [转]在SQL中join、inner join和left join的区别 --]
CopyRight © 2008-2009 JavaWind.Net Studio All Rights Reserved
Powered By JWind.BBS Vesion 1.0.0 Beta1 Processed in 8 ms,0 (Queries)  Gzip enabled
粤ICP备07511478号