首页 > 代码库 > 全面解析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: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个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。