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