注:本文来自 爱新觉罗.毓华 的回帖
/*标题:联接的各种写法作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)时间:2010-04-21地点:重庆大学科苑宾馆create table t1(id int, val int)insert into t1 values(1,1)insert into t1 values(2,2)create table t2(id int, val int)insert into t2 values(1,1)insert into t2 values(3,3)go--1、内联接:内联接是用比较运算符比较要联接列的值的联接。--inner join逻辑运算符返回满足第一个(顶端)输入与第二个(底端)输入联接的每一行。--inner join--相等联接select t1.* , t2.* from t1 inner join t2 on t1.id = t2.id--等同于select t1.* , t2.* from t1 , t2 where t1.id = t2.id/*id val id val ----------- ----------- ----------- ----------- 1 1 1 1(所影响的行数为 1 行)*/--不等联接select t1.* , t2.* from t1 inner join t2 on t1.id <> t2.id--等同于select t1.* , t2.* from t1 , t2 where t1.id <> t2.id/*id val id val ----------- ----------- ----------- ----------- 2 2 1 11 1 3 32 2 3 3(所影响的行数为 3 行)*/--2、左(外)联接:检索通过左向外联接引用的左表的所有行。--Left Outer Join 逻辑运算符返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。--它还返回任何在第二个输入中没有匹配行的第一个输入中的行。第二个输入中的非匹配行作为空值返回。--如果 Argument 列内不存在任何联接谓词,则每行都是一个匹配行。--left join (Left Outer Join)select t1.* , t2.* from t1 left join t2 on t1.id = t2.id/*id val id val ----------- ----------- ----------- ----------- 1 1 1 12 2 NULL NULL(所影响的行数为 2 行)*/--3、右(外)联接:检索通过右向外联接引用的右表的所有行。--Right Outer Join 逻辑运算符返回满足第二个(底端)输入与第一个(顶端)输入中的每个匹配行联接的每一行。--它还返回第二个输入中在第一输入中没有匹配行的任何行,即与 NULL 联接。--如果 Argument 列内不存在任何联接谓词,则每行都是一个匹配行。--right join(right Outer join) select t1.* , t2.* from t1 right join t2 on t1.id = t2.id/*id val id val ----------- ----------- ----------- ----------- 1 1 1 1NULL NULL 3 3(所影响的行数为 2 行)*/--4、全联接(完整外部联接):通过在联接结果中包括不匹配的行保留不匹配信息。--full join(full Outer join)select isnull(t1.id , t2.id) id , t1.val , t2.val from t1 full join t2 on t2.id = t1.id order by id/*id val val ----------- ----------- ----------- 1 1 12 2 NULL3 NULL 3(所影响的行数为 3 行)*/--5、交叉连接(迪卡尔积):没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。--Cross Join 逻辑运算符将第一个(顶端)输入中的每行与第二个(底端)输入中的每行联接在一起。--cross join(cross Outer join)select t1.* , t2.* from t1 cross join t2 /*id val id val ----------- ----------- ----------- ----------- 1 1 1 12 2 1 11 1 3 32 2 3 3(所影响的行数为 4 行)*/drop table t1 , t2