Sql server left join,right join和inner join的比较

转载于:http://www.2cto.com/database/201206/137067.html

今天来研究一下数据库left join 、right join 和 inner join 这三者之间的区别

在网上看别人的写过的源代码,绝大多数的应用系统开发,数据库都会有很多的各种各样的join,那些个表table之间join的让人眼花缭乱的,其实一直都是一知半解的状态,

因为在公司上班也不用自己去写SQL代码(我这里是指稍微大一点的正规软件公司,很小小公司还是要自己写sql的),因为公司有专门的DBA,通常都是DBA他们写好了,直接给我们存储过程的名字让我们去调用,

(下次说存储过程吧,这是个非常重要的东西,几乎都会用到,就像我们做ASP.NET开发一定要知道ADO.NET一样,存储过程这种预编译的SQL脚本对开发是很有好处的,我想在传智播客杨老师的基础视频当中只所以会在页面层代码里面直接写sql查询语句,应该是为了方便教学,节约时间吧)

废话不多说,开始学习

这里先给出一个官方的解释:

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

inner join(等值连接) 只返回两个表中联结字段相等的行

是不是看的有点晕,那下面我们就自己试验吧

第一步:建库建表的过程我就省略了,

因为昨天的测试有一些简单的代码,就直接在上面稍做修改进行测试,下面插入一点测试数据

[sql]

Insert into Table1 values (1,‘姚羽‘)

Insert into Table1 values (2,‘边兵兵‘)

Insert into Table1 values (3,‘袁磊‘)

Insert into Table1 values (5,‘传智博客‘)

Insert into Table2 values (1,‘姚羽‘)

Insert into Table2 values (2,‘柳春平‘)

Insert into Table2 values (3,‘张永超‘)

Insert into Table2 values (4,‘刘华健‘)

[sql]

Insert into Table1 values (1,‘姚羽‘)

Insert into Table1 values (2,‘边兵兵‘)

Insert into Table1 values (3,‘袁磊‘)

Insert into Table1 values (5,‘传智博客‘)

Insert into Table2 values (1,‘姚羽‘)

Insert into Table2 values (2,‘柳春平‘)

Insert into Table2 values (3,‘张永超‘)

Insert into Table2 values (4,‘刘华健‘)

查询出原表的数据如下:

我们对比两个table 发现,Table1 中的数据编号分别为1、2、3、5,而Table12中的数据编号分别为1、2、3、4,也就是说两个表中,只有最后一条数据不一样,分别为Table1中id为5的“传智播客”和Table2中id为4的“刘华健”是对应不上的。

好,我们继续...

第二步:执行left join 的效果

[sql]

Select * from Table1 A

Left join Table2 B

on A.id = B.id

[sql]

Select * from Table1 A

Left join Table2 B

on A.id = B.id

(所影响的行数为 4 行)

结果说明:

left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.

换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.id = B.id).

B表记录不足的地方均为NULL.

第三步:执行right join 的效果

[sql]

Select * from Table1 A

right join Table2 B

on A.id = B.id

[sql]

Select * from Table1 A

right join Table2 B

on A.id = B.id

(所影响的行数也为 4 行)

结果说明:

仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

第四步:执行inner join 的效果

[sql]

Select * from Table1 A

inner join Table2 B

on A.id = B.id

[sql]

Select * from Table1 A

inner join Table2 B

on A.id = B.id

结果说明:

很明显,这里只显示出了 A.id = B.id的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

好了,到此为止,总算弄清楚这两者之间的区别了,

数据库是软件开发的核心和基础,一定要学好。

时间: 2024-12-17 09:00:06

Sql server left join,right join和inner join的比较的相关文章

SQL Server的三种物理连接之Hash Join(三)

简介 在 SQL Server 2012 在一些特殊的例子下会看到下面的图标: Hash Join分为两个阶段,分别为生成和探测阶段. 首先是生成阶段,将输入源中的每一个条目经过散列函数的计算都放到不同的Hash Bucket中,其中Hash Function的选择和Hash Bucket的数量都是黑盒,通常来讲,查询优化器都会使用连接两端中比较小的哪个输入集来作为第一阶段的输入源. 接下来是探测阶段,对于另一个输入集合,同样针对每一行进行散列函数,确定其所应在的Hash Bucket,在针对这

Sql Server 与 MySql 在使用 update inner join 时的区别

Sql Server update tb_User set pass = ''-- 此处pass前不要加 tb_User 别名usr from tb_User usr inner join tb_Address addr on usr.nAddressFK = addr.nAddressID where usr.id=123 MySql UPDATE mem_world AS mw1 INNER JOIN mem_world AS mw2 ON mw1.parentid = mw2.wid SE

SQL SERVER中 外联接即(left join)on 和 where 的区别

使用内联接,无论在JOIN 子句还是 WHERE 子句中,条件具有相同的结果,但使用外联接时并非如此. 当条件在JOIN子句时,SQL SERVER包括外表的所有行,然后使用条件包括第二个表中的行. 当限制置于WHERE子句时,先执行联接,然后将where子句应用于联接行. 上述表述不是很明白 ,以下的解释更清楚. 即:ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行. 如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有

INNER JOIN与LEFT JOIN在SQL Server的性能

我创建了INNER JOIN 9桌,反正需要很长的(超过五分钟).所以,我的民歌改变INNER JOIN来LEFT JOIN LEFT JOIN的性能较好,在首次尽管我所知道的.之后我变了,查询的速度显著提高. 我想知道为什么LEFT JOIN的速度比INNER JOIN? 我的样子如下:SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D因此没有 更新: 这是我的简单架构的. FROM sidisaleshdr

SQL Server Join方式

1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQL Server中的三种Join方式 在Sql Server中,每一个join命令,在内部执行时,都会采用三种更具体的join方式来运行.这三种join的方法是:nested loops join.merge join和hash join.这三种方法,没有哪一种是永远最好的,但是都有其最适合的上下文.S

SQL Server nested loop join 效率试验

从很多网页上都看到,SQL Server有三种Join的算法, nested loop join, merge join, hash join. 其中最常用的就是nested loop join. 在介绍nested loop join的很多文章里,都提到如果两个表做nested loop join,取行数较小的表作为外循环表,行数较多的表作为内循环表, join的效率会比较高. 其中之一的原因是如果内循环表做join的列上有合适的索引的话,那么外循环的每一条输入数据可以做索引的seek,这样就

SQL Server Join

SQL Server Join 执行顺序 ON 定义表连接字段(数据量大的时候添加索引也可以查询速度进行优化 On.. And.. : And 限定的条件是在 Join之前对目标表的数据进行限定 Where 对连接后的数据进行过滤筛选 SELECT * FROM EMPLOY E LEFT JOIN DEPARTMENT D ON E.DEPTNO=D.DEPTNO AND D.DEPTNO=40-- EMPLOY 表不添加限制,所有连接之前获取所有EMPLOY表的数据 相当于Select *

【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题

原文:[Transact-SQL]SQL Server自动把left join自动转化为inner join.以及关联时的数据重复问题 1.SQL Server自动把left join自动转化为inner join的问题: 下面的两个语句都是left join的,但是一个却转化成了 inner join drop table a,B go create table a(id int) insert into a select 1 union all select 2 create table b

SQL SERVER 2012 第四章 连接 JOIN语句的早期语法结构 & 联合UNION

1/内部连接的早期语法结构 INNER JOIN SELECT * FROM Person.Person JOIN HumanResources.Employee ON Person.Person.ID = HumanResources.Employee.ID 等价于早期的也就是老版本的 SELECT * FROM Person.Person,HumanResources.Employee WHERE Person.Person.ID = HumanResources.Employee.ID 2

SQL中把筛选条件放在left outer join的on 和 where 后面的区别

create table [Table_1]([PKey] int,[FKey] int,[value1] int,[value2] int)create table[Table_2]([PKey] int,[value1] int,[value2] int)drop table [Table_1]drop table [Table_2]delete[Table_1]delete[Table_2]insert into [Table_1] values(1,0,21,31)insert into