首页 > 代码库 > 全面解析SQL SERVER 的左右内连接

全面解析SQL SERVER 的左右内连接

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:123 所以返回的是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 的左右内连接