天天看点

left join,inner join,right join,cross join,full join

1,总论:

LEFT JOIN 返回”first_table”中所有的行尽管在” second_table”中没有相匹配的数据。 RIGHT JOIN 返回”second_table”中所有的行尽管在”first_table”中没有相匹配的数据。 INNER JOIN 返回的结果集是两个表中所有相匹配的数据。

没听明白?请继续看下文分解。 2 ,分解: 还是用一个例子来的痛快些。。。 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 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 join @b Bb on Aa.a=Bb.a

-- 外:

select * from @a Aa full join @b Bb on Aa.a=Bb.a

-- 完全

select * from @a,@b

cross join 是笛卡儿乘积 就是一张表的行数乘以另一张表的行数

left join 第一张表的连接列在第二张表中没有匹配是 , 第二张表中的值返回 null

right join 第二张表的连接列在第一张表中没有匹配是 , 第一张表中的值返回 null

full join 返回两张表中的行 left join+right join

inner join 只返回两张表连接列的匹配项 表A记录如下:

aID        aNum

1           a20050111

2           a20050112

3           a20050113

4           a20050114

5           a20050115

表B记录如下:

bID        bName

1            2006032401

2           2006032402

3           2006032403

4           2006032404

8           2006032408

实验如下:

1.left join

sql语句如下:

select * from A

left join B

on A.aID = B.bID

结果如下:

aID        aNum                   bID           bName

1            a20050111         1               2006032401

2            a20050112         2              2006032402

3            a20050113         3              2006032403

4            a20050114         4              2006032404

5            a20050115         NULL       NULL

(所影响的行数为 5 行)

结果说明:

        left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.

换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).

B表记录不足的地方均为NULL.

2.right join

sql语句如下:

select * from A

right join B

on A.aID = B.bID

结果如下:

aID        aNum                   bID           bName

1            a20050111         1               2006032401

2            a20050112         2              2006032402

3            a20050113         3              2006032403

4            a20050114         4              2006032404

NULL    NULL                   8              2006032408

(所影响的行数为 5 行)

结果说明:

        仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

3.inner join

sql语句如下:

select * from A

innerjoin B

on A.aID = B.bID

结果如下:

aID        aNum                   bID           bName

1            a20050111         1               2006032401

2            a20050112         2              2006032402

3            a20050113         3              2006032403

4            a20050114         4              2006032404

结果说明:

        很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.