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 的左右内连接的更多相关文章

  1. 深入解析SQL Server并行执行原理及实践(上)

    在成熟领先的企业级数据库系统中,并行查询可以说是一大利器,在某些场景下他可以显著的提升查询的相应时间,提升用户体验.如SQL Server, Oracle等, Mysql目前还未实现,而Postgre ...

  2. SQL Server DAC——专用管理员连接

    今天打开数据库刚要连接时,看到“连接到服务器”窗口,突发的想到:要是SQL Server 不再响应正常的连接请求,又想使用数据库时,我们该怎么办?      其实我们还能通过“SQL Server D ...

  3. SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

    SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...

  4. JDBC与SQL SERVER各个版本的连接方法

    转至:blog.csdn.net/ying5420/article/details/4488246 1.SQL SERVER 2000 JDBC驱动程序:msbase.jar.mssqlserver. ...

  5. 解决SQL Server管理器无法连接远程数据库Error: 1326错误

    解决SQL Server管理器无法连接远程数据库Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例 ...

  6. SQL Server 2005无法远程连接的解决方法

    以前一直连接本地的数据库,连接SQL Server 2005是小菜的... 做项目也是老师搭好了服务器端,打上IP去访问就行...也不用考虑太多. 今天自己在公司搭SQL Server 2005服务器 ...

  7. JDBC连接SQL server与ADO.NET连接Sql Server对比

    JDBC连接SQL server与ADO.NET连接Sql Server对比 1.JDBC连接SQL server 1)java方面目前有很多驱动能够驱动连接SQL servernet.   主流的有 ...

  8. 利用Ring Buffer在SQL Server 2008中进行连接故障排除

    原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...

  9. sql server 2008 64位连接sql 2000服务器的时候出现

    来源 https://blog.csdn.net/loeley/article/details/7095741 sql server 2008 64位连接sql 2000服务器的时候出现以下提示: 链 ...

随机推荐

  1. Fedora 23如何安装LAMP服务器

    LAMP 是开源系统上 Web 服务器的梦幻组合.LAMP 是 Linux. Apache HTTP 服务. MySQL/MariaDB 数据库和 PHP. Perl 或 Python 的简称. 下面 ...

  2. makefile文件的技术

    [快速的学习笔记] gcc命令:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html#_Toc311642845 makef ...

  3. DML 数据操控语言

    一.DML数据操作语言  (DQL  select ) 主要用于检索.插入和修改数据库信息.它是最常用的SQL命令,如INSERT(插入).UPDATE(更新).SELECT(选择).DELETE(删 ...

  4. oracle冷备份

    windows环境下Oracle数据库冷备份和恢复 1.点击开始菜单的“运行”,输入sqlplus/nolog 2.在弹出的命令行窗口以sysdba身份登陆,要输入:系统用户名/登陆密码@数据库实例名 ...

  5. 怒刷DP之 HDU 1257

    最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  6. 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 ...

  7. HDU 1087 Super Jumping! Jumping! Jumping! (DP)

    C - Super Jumping! Jumping! Jumping! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  8. hdu 4494 最小费用流

    思路:这题我在下午重现的时候就用的费用流做,可是各种悲催的超时,只是我一开始的那种建图方式多了一个二分查找. 戏剧性的是,求距离的返回值写成int型了,CodeBlock编译器又没有警告,然后就WA啊 ...

  9. Python之Python Imaging Library

    document:http://effbot.org/imagingbook/pil-index.htm http://pillow.readthedocs.io/en/3.1.x/index.htm ...

  10. 【奇怪现象】用联通访问某些ASP.NET网站会产生__EVENTVALIDATION字段,用电信却只有:__VIEWSTATE。【正常】?原因?

    [奇怪现象]用联通访问某些ASP.NET网站会产生__EVENTVALIDATION字段,用电信却只有:__VIEWSTATE.[正常]?原因? 对于__VIEWSTATE和__EVENTVALIDA ...