全面解析SQL SERVER 的左右內串連

來源:互聯網
上載者:User

標籤:

SQL SERVER資料庫的三種常用串連解析: 這裡先給出一個官方的解釋:left join(左聯結) 返回包括左表中的所有記錄和右表中連接欄位相等的記錄right join(右聯結) 返回包括右表中的所有記錄和左表中連接欄位相等的記錄inner join(等值串連) 只返回兩個表中連接欄位相等的行  USE [BI]GODROP TABLE BI.dbo.TABLE_ONE;GODROP TABLE BI.dbo.TABLE_TWO;GOCREATE TABLE BI.dbo.TABLE_ONE( [ID] [int] NOT NULL, [NAME] [nvarchar](50) NOT NULL) ON [PRIMARY]GOCREATE TABLE BI.dbo.TABLE_TWO( [ID] [int] NOT NULL, [SCORE] [int] NOT NULL) ON [PRIMARY]GO1, 如果我兩個表分別插入的是如下的資訊:INSERT INTO BI.DBO.TABLE_ONE VALUES(1,‘張三‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(2,‘李四‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(3,‘王五‘);GOINSERT INTO BI.DBO.TABLE_TWO VALUES(1,90);INSERT INTO BI.DBO.TABLE_TWO VALUES(2,95);INSERT INTO BI.DBO.TABLE_TWO VALUES(3,98);GO 在這種情況下:其實左串連和右串連,內串連的結果都是一樣的:--左串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE LEFT JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;--右串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE RIGHT JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;--內串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE INNER JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID; 得到的結果都是如下:結論:如果兩個表的記錄數是一樣的,而且主鍵的值也是一樣的話,這個時候用什麼串連他們的結果都是一樣的。  2, 如果我兩個表分別插入的是如下的資訊:truncate table BI.DBO.TABLE_ONE;truncate table BI.DBO.TABLE_TWO;INSERT INTO BI.DBO.TABLE_ONE VALUES(1,‘張三‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(2,‘李四‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(3,‘王五‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(4,‘劉六‘);GOINSERT INTO BI.DBO.TABLE_TWO VALUES(1,90);INSERT INTO BI.DBO.TABLE_TWO VALUES(2,95);INSERT INTO BI.DBO.TABLE_TWO VALUES(3,98);INSERT INTO BI.DBO.TABLE_TWO VALUES(5,99);GO--左串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE LEFT JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;返回的是左表的4條記錄,其中左邊ID=4 的在右表中存在串連的,所有右表對應的SCORE的值返回的是NULL。--右串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE RIGHT JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID; 1     張三     902     李四     953     王五     98NULL     NULL     99 返回的是右表,TABLE_TWO的4條記錄相應的記錄,其中TABLE_TWO有ID=5 的的記錄,但是TABLE_ONE裡沒有,則返回NULL。--內串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE INNER JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID; ID     NAME     SCORE1     張三     902     李四     953     王五     98返回的是左右兩個表都有的ID:1,2,3 所以返回的是3條共有的記錄值 。 結論:如果兩個表是按照主鍵進行串連的話,左串連的話返回的記錄集肯定是等於左表返回的記錄數;右串連的話記錄集肯定是等於右表返回的記錄數;內串連就返回兩個表都存在的記錄。 上面都是以主鍵為串連條件的,對於左或右串連來說,得到的串連結果集肯定是等於串連中主表(左或右表)的記錄數的。對於內串連,則返回的是兩個表中都有的交集的記錄數。下面來介紹一下不是按照主鍵來串連的情況下,這個時候最壞的記錄數就是笛卡爾積個記錄數。3, 如果我兩個表分別插入的是如下的資訊:truncate table BI.DBO.TABLE_ONE;truncate table BI.DBO.TABLE_TWO;INSERT INTO BI.DBO.TABLE_ONE VALUES(1,‘張三‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(2,‘李四‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(3,‘王五‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(4,‘劉六‘);GOINSERT INTO BI.DBO.TABLE_TWO VALUES(1,90);INSERT INTO BI.DBO.TABLE_TWO VALUES(1,95);INSERT INTO BI.DBO.TABLE_TWO VALUES(1,98);INSERT INTO BI.DBO.TABLE_TWO VALUES(1,99);GO --左串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE LEFT JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;1     張三     901     張三     951     張三     981     張三     992     李四     NULL3     王五     NULL4     劉六     NULL得出的結果集記錄數7是大於主表左邊4條記錄的。--右串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE RIGHT JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;1     張三     901     張三     951     張三     981     張三     99--內串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE INNER JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;1     張三     901     張三     951     張三     981     張三     99 4,下面就是極端的情況下,產生的是笛卡爾積。即兩個表的記錄數相乘個記錄數。truncate table BI.DBO.TABLE_ONE;truncate table BI.DBO.TABLE_TWO;INSERT INTO BI.DBO.TABLE_ONE VALUES(1,‘張三‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(1,‘李四‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(1,‘王五‘);INSERT INTO BI.DBO.TABLE_ONE VALUES(1,‘劉六‘);GOINSERT INTO BI.DBO.TABLE_TWO VALUES(1,90);INSERT INTO BI.DBO.TABLE_TWO VALUES(1,95);INSERT INTO BI.DBO.TABLE_TWO VALUES(1,98);INSERT INTO BI.DBO.TABLE_TWO VALUES(1,99);GO--左串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE LEFT JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;--右串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE RIGHT JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;--內串連SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCOREFROM TABLE_ONE INNER JOIN TABLE_TWOON TABLE_ONE.ID=TABLE_TWO.ID;1     張三     901     張三     951     張三     981     張三     991     李四     901     李四     951     李四     981     李四     991     王五     901     王五     951     王五     981     王五     991     劉六     901     劉六     951     劉六     981     劉六     99在這種情況下得出的結果集都是14條記錄。 結論: 無論左,右串連得到的結果集的記錄數肯定是大於等於主表的記錄數的,而內串連的結果集可以是小於,等於,大於串連的表的記錄數的。左,右還是內串連表的一個重要的用處:可以橫行的擴充一個表,可以得到一個有更多屬性的新的表。UNION 可以縱向的增加一個表的記錄行數。

 

全面解析SQL SERVER 的左右內串連

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.