天天看點

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并不以誰為基礎,它隻顯示符合條件的記錄.