SQL--JOIN之完全用法

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中可有可无!


上一篇: 关于创作共用协议
下一篇: 判断某个日期是否属于本周
文章来自: 网络
引用通告: 查看所有引用 | 我要引用此文章
Tags:
最新日志:
评论: 1 | 引用: 0 | 查看次数: 6940
发表评论
登录后再发表评论!