標籤:
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 的左右內串連