SQL中大概有这么几种JOIN:cross join、inner join、left outer join(left join)、right outer join(right join)和full outer join(full join)。
首先都是基于cross join(笛卡尔乘积),然后是inner join,在笛卡尔乘积的结果集中去掉不符合连接条件的行。
left outer join 是在inner join的结果集上加上左表中没被选上的行,行的右表部分每个字段都用NUll填充。
right outer join 是在inner join的结果集上加上右表中没被选上的行,行的左表部分全用NULL填充。
full outer join 是left outer join和right outer join的并集。
注:笛卡尔(Descartes)乘积又叫直积。设A、B是任意两个集合,在集合A中任意趣一个元素x,在集合B中任意取一个元素y,组成一个有序对(x,y),把这样的有序对作为新的元素,他们的全体组成的集合称为集合A和集合B的直积,记为A×B,即A×B={(x,y)|x∈A且y∈B}。
假设有如下两个表:
Table1:
id name total
----- ----- -----
1 aaa 10
2 bbb 20
Table2:
id name total
----- ----- -----
1 aaa 30
2 ccc 10
下边我们来看看各种JOIN的结果:
1.cross join
Select Table1.name,Table1.total,Table2.name,Table2.total From Table1 cross join Table2
结果集:
name total name total
----- ----- ----- -----
aaa 40 aaa 30
bbb 20 aaa 30
aaa 40 ccc 10
bbb 20 ccc 10
2.inner join
Select Table1.name,Table1.total,Table2.name,Table2.total From Table1 inner join Table2 on Table1.name=Table2.name
结果集:
name total name total
----- ----- ----- -----
aaa 40 aaa 30
扩展:full join为全集,取inner join的补集
Select Table1.name,Table1.total,Table2.name,Table2.total From Table1 full join Table2 on Table1.name=Table2.name Where Table1.name is null or Table2.name is null
结果集:
name total name total
----- ----- ----- -----
NULL NULL ccc 10
bbb 20 NULL NULL
3.full join
Select Table1.name,Table1.total,Table2.name,Table2.total From Table1 full join Table2 on Table1.name=Table2.name
结果集:
name total name total
----- ----- ----- -----
aaa 40 aaa 30
NULL NULL ccc 10
bbb 20 NULL NULL
4.left join
Select Table1.name,Table1.total,Table2.name,Table2.total From Table1 left join Table2 on Table1.name=Table2.name
结果集:
name total name total
----- ----- ----- -----
aaa 40 aaa 30
bbb 20 NULL NULL
扩展:left join为全集,取inner join的补集
Select Table1.name,Table1.total,Table2.name,Table2.total From Table1 left join Table2 on Table1.name=Table2.name Where Table2.name is null
结果集:
name total name total
----- ----- ----- -----
bbb 20 NULL NULL
5.right join
Select Table1.name,Table1.total,Table2.name,Table2.total From Table1 right join Table2 on Table1.name=Table2.name
结果集:
name total name total
----- ----- ----- -----
aaa 40 aaa 30
NULL NULL ccc 10
扩展:right join为全集,取inner join的补集
Select Table1.name,Table1.total,Table2.name,Table2.total From Table1 right join Table2 on Table1.name=Table2.name Where Table1.name is null
结果集:
name total name total
----- ----- ----- -----
NULL NULL ccc 10
2008-09-11补:三表联合查询
Select TOP 1 A.SoftName,A.SoftImage,B.DownFileName,C.DownloadPath FROM (NC_SoftList A INNER JOIN NC_DownAddress B On A.SoftId=B.SoftId) INNER JOIN NC_DownServer C ON B.DownId=C.RootId Where C.depth=1 AND A.SoftId=2
注:在ACCESS中上边括号必需的,而在SQL Server中可有可无!
评论(0)
暂无评论。