全面解析SQL SERVER 的左右内连接
SQL SERVER数据库的三种常用连接解析: 这里先给出一个官方的解释:
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行 USE [BI]
GO
DROP TABLE BI.dbo.TABLE_ONE;
GO
DROP TABLE BI.dbo.TABLE_TWO;
GO
CREATE TABLE BI.dbo.TABLE_ONE(
[ID] [int] NOT NULL,
[NAME] [nvarchar]() NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE BI.dbo.TABLE_TWO(
[ID] [int] NOT NULL,
[SCORE] [int] NOT NULL
) ON [PRIMARY]
GO , 如果我两个表分别插入的是如下的信息: INSERT INTO BI.DBO.TABLE_ONE VALUES(,'张三');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'李四');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'王五');
GO
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
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; 得到的结果都是如下: 结论:如果两个表的记录数是一样的,而且主键的值也是一样的话,这个时候用什么连接他们的结果都是一样的。 , 如果我两个表分别插入的是如下的信息: truncate table BI.DBO.TABLE_ONE;
truncate table BI.DBO.TABLE_TWO; INSERT INTO BI.DBO.TABLE_ONE VALUES(,'张三');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'李四');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'王五');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'刘六');
GO
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
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; 返回的是左表的4条记录,其中左边ID= 的在右表中存在连接的,所有右表对应的SCORE的值返回的是NULL。 --右连接
SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCORE
FROM TABLE_ONE RIGHT JOIN TABLE_TWO
ON TABLE_ONE.ID=TABLE_TWO.ID; 张三
李四
王五
NULL NULL 返回的是右表,TABLE_TWO的4条记录相应的记录,其中TABLE_TWO有ID= 的的记录,但是TABLE_ONE里没有,则返回NULL。 --内连接
SELECT TABLE_ONE.ID,TABLE_ONE.NAME,TABLE_TWO.SCORE
FROM TABLE_ONE INNER JOIN TABLE_TWO
ON TABLE_ONE.ID=TABLE_TWO.ID; ID NAME SCORE
张三
李四
王五 返回的是左右两个表都有的ID:,, 所以返回的是3条共有的记录值 。 结论:如果两个表是按照主键进行连接的话,左连接的话返回的记录集肯定是等于左表返回的记录数;右连接的话记录集肯定是等于右表返回的记录数;内连接就返回两个表都存在的记录。 上面都是以主键为连接条件的,对于左或右连接来说,得到的连接结果集肯定是等于连接中主表(左或右表)的记录数的。对于内连接,则返回的是两个表中都有的交集的记录数。下面来介绍一下不是按照主键来连接的情况下,这个时候最坏的记录数就是笛卡尔积个记录数。 , 如果我两个表分别插入的是如下的信息: truncate table BI.DBO.TABLE_ONE;
truncate table BI.DBO.TABLE_TWO; INSERT INTO BI.DBO.TABLE_ONE VALUES(,'张三');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'李四');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'王五');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'刘六');
GO
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
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; 张三
张三
张三
张三
李四 NULL
王五 NULL
刘六 NULL 得出的结果集记录数7是大于主表左边4条记录的。 --右连接
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; 张三
张三
张三
张三 ,下面就是极端的情况下,产生的是笛卡尔积。即两个表的记录数相乘个记录数。 truncate table BI.DBO.TABLE_ONE;
truncate table BI.DBO.TABLE_TWO; INSERT INTO BI.DBO.TABLE_ONE VALUES(,'张三');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'李四');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'王五');
INSERT INTO BI.DBO.TABLE_ONE VALUES(,'刘六');
GO
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
INSERT INTO BI.DBO.TABLE_TWO VALUES(,);
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; 张三
张三
张三
张三
李四
李四
李四
李四
王五
王五
王五
王五
刘六
刘六
刘六
刘六 在这种情况下得出的结果集都是14条记录。 结论: 无论左,右连接得到的结果集的记录数肯定是大于等于主表的记录数的,而内连接的结果集可以是小于,等于,大于连接的表的记录数的。 左,右还是内连接表的一个重要的用处:可以横行的扩展一个表,可以得到一个有更多属性的新的表。 UNION 可以纵向的增加一个表的记录行数。
全面解析SQL SERVER 的左右内连接的更多相关文章
- 深入解析SQL Server并行执行原理及实践(上)
在成熟领先的企业级数据库系统中,并行查询可以说是一大利器,在某些场景下他可以显著的提升查询的相应时间,提升用户体验.如SQL Server, Oracle等, Mysql目前还未实现,而Postgre ...
- SQL Server DAC——专用管理员连接
今天打开数据库刚要连接时,看到“连接到服务器”窗口,突发的想到:要是SQL Server 不再响应正常的连接请求,又想使用数据库时,我们该怎么办? 其实我们还能通过“SQL Server D ...
- SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)
SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...
- JDBC与SQL SERVER各个版本的连接方法
转至:blog.csdn.net/ying5420/article/details/4488246 1.SQL SERVER 2000 JDBC驱动程序:msbase.jar.mssqlserver. ...
- 解决SQL Server管理器无法连接远程数据库Error: 1326错误
解决SQL Server管理器无法连接远程数据库Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例 ...
- SQL Server 2005无法远程连接的解决方法
以前一直连接本地的数据库,连接SQL Server 2005是小菜的... 做项目也是老师搭好了服务器端,打上IP去访问就行...也不用考虑太多. 今天自己在公司搭SQL Server 2005服务器 ...
- JDBC连接SQL server与ADO.NET连接Sql Server对比
JDBC连接SQL server与ADO.NET连接Sql Server对比 1.JDBC连接SQL server 1)java方面目前有很多驱动能够驱动连接SQL servernet. 主流的有 ...
- 利用Ring Buffer在SQL Server 2008中进行连接故障排除
原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...
- sql server 2008 64位连接sql 2000服务器的时候出现
来源 https://blog.csdn.net/loeley/article/details/7095741 sql server 2008 64位连接sql 2000服务器的时候出现以下提示: 链 ...
随机推荐
- Fedora 23如何安装LAMP服务器
LAMP 是开源系统上 Web 服务器的梦幻组合.LAMP 是 Linux. Apache HTTP 服务. MySQL/MariaDB 数据库和 PHP. Perl 或 Python 的简称. 下面 ...
- makefile文件的技术
[快速的学习笔记] gcc命令:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html#_Toc311642845 makef ...
- DML 数据操控语言
一.DML数据操作语言 (DQL select ) 主要用于检索.插入和修改数据库信息.它是最常用的SQL命令,如INSERT(插入).UPDATE(更新).SELECT(选择).DELETE(删 ...
- oracle冷备份
windows环境下Oracle数据库冷备份和恢复 1.点击开始菜单的“运行”,输入sqlplus/nolog 2.在弹出的命令行窗口以sysdba身份登陆,要输入:系统用户名/登陆密码@数据库实例名 ...
- 怒刷DP之 HDU 1257
最少拦截系统 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- HDU 3038 How Many Answers Are Wrong (并查集)
How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1087 Super Jumping! Jumping! Jumping! (DP)
C - Super Jumping! Jumping! Jumping! Time Limit:1000MS Memory Limit:32768KB 64bit IO Format: ...
- hdu 4494 最小费用流
思路:这题我在下午重现的时候就用的费用流做,可是各种悲催的超时,只是我一开始的那种建图方式多了一个二分查找. 戏剧性的是,求距离的返回值写成int型了,CodeBlock编译器又没有警告,然后就WA啊 ...
- Python之Python Imaging Library
document:http://effbot.org/imagingbook/pil-index.htm http://pillow.readthedocs.io/en/3.1.x/index.htm ...
- 【奇怪现象】用联通访问某些ASP.NET网站会产生__EVENTVALIDATION字段,用电信却只有:__VIEWSTATE。【正常】?原因?
[奇怪现象]用联通访问某些ASP.NET网站会产生__EVENTVALIDATION字段,用电信却只有:__VIEWSTATE.[正常]?原因? 对于__VIEWSTATE和__EVENTVALIDA ...