天天看點

【SQL】詳解SQL Server連接配接(内連接配接、外連接配接、交叉連接配接)

有兩個表A和表B。表A結構如下: Aid:int;辨別種子,主鍵,自增ID Aname:varchar 資料情況,

即用select * from A出來的記錄情況如下圖1所示:

【SQL】詳解SQL Server連接配接(内連接配接、外連接配接、交叉連接配接)

圖 1:A 表資料

表B結構如下: Bid:int;辨別種子,主鍵,自增ID Bnameid:int 資料情況,即用select * from B出

來的記錄情況如下圖2所示:

【SQL】詳解SQL Server連接配接(内連接配接、外連接配接、交叉連接配接)

圖 2:B 表資料

為了把Bid和Aid加以區分,不讓大家有誤解,是以把Bid的起始種子設定為100。有SQL基本知識的人都知道,兩個表要做連接配接,就必須有個連接配接字段,從上表中的資料可以看出,在A表中的Aid和B表中的

Bnameid就是兩個連接配接字段。下圖3說明了連接配接的所有記錄集之間的關系:

【SQL】詳解SQL Server連接配接(内連接配接、外連接配接、交叉連接配接)

圖 3: 連接配接關系圖 

現在我們對内連接配接和外連接配接一一講解。 

1.内連接配接:利用内連接配接可擷取兩表的公共部分的記錄,即圖3的記錄集C 語句如下:Select * ,from A JOIN B ,ON A.Aid=B.Bnameid 運作結果如下圖4所示:其實select * from A,B where A.Aid=B.Bnameid與Select * from A JOIN B ON A.Aid=B.Bnameid的運作結果是一樣的。

【SQL】詳解SQL Server連接配接(内連接配接、外連接配接、交叉連接配接)

圖 4: 内連接配接資料

 2.外連接配接:外連接配接分為兩種,一種是左連接配接(Left JOIN)和右連接配接(Right JOIN)

 (1)左連接配接(Left JOIN):即圖3公共部分記錄集C+表A記錄集A1。

 語句如下:select *

from A Left JOIN B

ON A.Aid=B.Bnameid 

運作結果如下圖5所示:

【SQL】詳解SQL Server連接配接(内連接配接、外連接配接、交叉連接配接)

圖 5: 左連接配接資料     

說明:在語句中,A在B的左邊,并且是Left Join,是以其運算方式為:A左連接配接B的記錄=圖3公共部分

記錄集C+表A記錄集A1

在圖3中即記錄集C中的存在的Aid為:2 3 6 7 8 

圖1中即表A所有記錄集A中存在的Aid為:1 2 3 4 5 6 7 8 9  

表A記錄集A1中存在的Aid=(圖1中即A表中所有Aid)-(圖3中即記錄集C中存在的Aid),最終得出為:1 4 5 9  

由此得出圖5中A左連接配接B的記錄=圖3公共部分記錄集C+表A記錄集A1, 最終得出的結果圖5中可以看出Bnameid及Bid非NULL的記錄都為圖3公共部分記錄集C中的記錄;Bnameid及Bid為NULL的Aid為1 4 5 9的四筆記錄就是表A記錄集A1中存在的Aid。

 (2)右連接配接(Right JOIN):即圖3公共部分記錄集C+表B記錄集B1。

語句如下:select *

from A Right JOIN B

ON A.Aid=B.Bnameid  

運作結果如下圖6所示:

【SQL】詳解SQL Server連接配接(内連接配接、外連接配接、交叉連接配接)

圖 6: 右連接配接資料 

說明: 在語句中,A在B的左邊,并且是Right Join,是以其運算方式為:A右連接配接B的記錄=圖3公共部分記錄集C+表B記錄集B1 

在圖3中即記錄集C中的存在的Aid為:2 3 6 7 8  

圖2中即表B所有記錄集B中存在的Bnameid為:2 3 6 7 8 11  

表B記錄集B1中存在的Bnameid=(圖2中即B表中所有Bnameid)-(圖3中即記錄集C中存在的Aid),最終得出為:11  

由此得出圖6中A右連接配接B的記錄=圖3公共部分記錄集C+表B記錄集B1, 最終得出的結果圖6中可以看出Aid及Aname非NULL的記錄都為圖3公共部分記錄集C中的記錄;Aid及Aname為NULL的Aid為11的記錄就是表B記錄集B1中存在的Bnameid。   

全連接配接:

概念:傳回左表和右表中的所有行。當某行在另一表中沒有比對行,則另一表中的列傳回空值

  1.    select * 
  2.    from  T_student s full join T_class c 
  3.   on s.classId = c.classId

 結果是:

【SQL】詳解SQL Server連接配接(内連接配接、外連接配接、交叉連接配接)

  總結:傳回左表和右表中的所有行。

交叉連接配接(CROSS JOIN):也稱迪卡爾積

    概念:不帶WHERE條件子句,它将會傳回被連接配接的兩個表的笛卡爾積,傳回結果的行數等于兩個表行數的乘積(例如:T_student和T_class,傳回4*4=16條記錄),如果帶where,傳回或顯示的是比對的行數

2、有where子句,往往會先生成兩個表行數乘積的資料表,然後才根據where條件從中選擇。

查詢結果跟内連接配接的查詢結果是一樣。