全面解析SQLSERVER的左右内连接(二)

2014-11-23 22:20:17 · 作者: · 浏览: 76
OM TABLE_ONE RIGHT JOIN TABLE_TWO
ON TABLE_ONE.ID=TABLE_TWO.ID;

1 张三 90
1 张三 95
1 张三 98
1 张三 99


--内连接
SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCORE
FROM TABLE_ONE INNER JOIN TABLE_TWO
ON TABLE_ONE.ID=TABLE_TWO.ID;

1 张三 90
1 张三 95
1 张三 98
1 张三 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,'刘六');
GO
INSERT 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.SCORE
FROM TABLE_ONE LEFT JOIN TABLE_TWO
ON TABLE_ONE.ID=TABLE_TWO.ID;

--右连接
SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCORE
FROM TABLE_ONE RIGHT JOIN TABLE_TWO
ON TABLE_ONE.ID=TABLE_TWO.ID;


--内连接
SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCORE
FROM TABLE_ONE INNER JOIN TABLE_TWO
ON TABLE_ONE.ID=TABLE_TWO.ID;

1 张三 90
1 张三 95
1 张三 98
1 张三 99
1 李四 90
1 李四 95
1 李四 98
1 李四 99
1 王五 90
1 王五 95
1 王五 98
1 王五 99
1 刘六 90
1 刘六 95
1 刘六 98
1 刘六 99

在这种情况下得出的结果集都是14条记录。

结论: 无论左,右连接得到的结果集的记录数肯定是大于等于主表的记录数的,而内连接的结果集可以是小于,等于,大于连接的表的记录数的。

左,右还是内连接表的一个重要的用处:可以横行的扩展一个表,可以得到一个有更多属性的新的表。

UNION 可以纵向的增加一个表的记录行数。