內串連和外串連區別

來源:互聯網
上載者:User

在之前,我對MSSQL中的內串連和外串連所得出的資料集不是很清楚。這幾天重新溫習了一下SQL的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對SQL的串連語句不太理解的朋友能夠有所協助。(發這麼菜的教程,各位大大們別笑話偶了,呵:D )

有兩個表A和表B。
表A結構如下:
Aid:int;識別值種子,主鍵,自增ID
Aname:varchar

資料情況,即用select * from A出來的記錄情況如1所示:

圖1:A表資料

表B結構如下:
Bid:int;識別值種子,主鍵,自增ID
Bnameid:int

資料情況,即用select * from B出來的記錄情況如2所示:

圖2:B表資料

為了把Bid和Aid加以區分,不讓大家有誤解,所以把Bid的起始種子設定為100。
有SQL基本知識的人都知道,兩個表要做串連,就必須有個串連欄位,從上表中的資料可以看出,在A表中的Aid和B表中的Bnameid就是兩個串連欄位。
3說明了串連的所有記錄集之間的關係:

圖3:串連關係圖

現在我們對內串連和外串連一一講解。
1.內串連:利用內串連可擷取兩表的公用部分的記錄,即圖3的記錄集C
語句如下:Select * from A JOIN B ON A.Aid=B.Bnameid
運行結果如4所示:

圖4:內串連資料

其實select * from A,B where A.Aid=B.Bnameid與Select * from A JOIN B ON A.Aid=B.Bnameid的運行結果是一樣的。
2.外串連:外串連分為兩種,一種是左串連(Left JOIN)和右串連(Right JOIN)
   (1)左串連(Left JOIN):即圖3公用部分記錄集C+表A記錄集A1。    
      語句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid
      運行結果如5所示:

圖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所示:

圖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。
    
總結:

通過上面的運算解說,相信很多人已經想到,上面的情況(包括圖3的關係圖)說明的都只是A在B的左邊的情況,
以下語句B在A的右邊的又會出現什麼情況呢??
select * from B Left JOIN A ON A.Aid=B.Bnameid
select * from B Right JOIN A ON A.Aid=B.Bnameid

其實對圖3左右翻轉一下就可以得出以下結論:
select * from B Left JOIN A ON A.Aid=B.Bnameid和select * from A Right JOIN B ON A.Aid=B.Bnameid所得出的記錄集是一樣的

select * from B Right JOIN A ON A.Aid=B.Bnameid和select * from A Left JOIN B ON A.Aid=B.Bnameid所得出的記錄集也是一樣的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.