转载于:http://www.2cto.com/database/201206/137067.html
 
Sql server left join,right join和inner join的比较
 
今天来研究一下数据库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并不以谁为基础,它只显示符合条件的记录.
好了,到此为止,总算弄清楚这两者之间的区别了,
数据库是软件开发的核心和基础,一定要学好。
 

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

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

    简介 在 SQL Server 2012 在一些特殊的例子下会看到下面的图标: Hash Join分为两个阶段,分别为生成和探测阶段. 首先是生成阶段,将输入源中的每一个条目经过散列函数的计算都放到不 ...

  2. SQL Server的三种物理连接之Merge join(二)

    简介 merge join 对两个表在连接列上按照相同的规则排序,然后再做merge,匹配的输出. 下面这个动态图展示了merge join的详细过程. merge join示例 创建两个表 IF O ...

  3. SQL Server的三种物理连接之Loop Join(一)

    Sql Server有三种物理连接Loop Join,Merge Join,Hash Join, 当表之间连接的时候会选择其中之一,不同的连接产生的性能不同,理解这三种物理连接对性能调优有很大帮助. ...

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

    Sql Server -- 不使用别名 UPDATE tb_User SET tb_User.pass = '' FROM tb_User usr INNER JOIN tb_Address addr ...

  5. 《SQL Server 2008从入门到精通》--20180703

    SELECT操作多表数据 关于连接的问题,在<SQL必知必会>学习笔记中已经讲到过,但是没有掌握完全,所以再学一下. JOIN连接 首先我们先来看一下最简单的连接.Products表和Ve ...

  6. SQL Server的Linked Servers

    文章搬运自:SQL Server的Linked Servers(链接) 参考引用一下,感谢作者~ 我们在使用SQL Server时,有时会有这种需求,需要从一个SQL Server服务器A中,查询另一 ...

  7. SQL Server的Linked Servers(链接)

    我们在使用SQL Server时,有时会有这种需求,需要从一个SQL Server服务器A中,查询另一个SQL Server服务器B中的表,然后将SQL Server服务器A中的表和SQL Serve ...

  8. SQL Server Join方式

    原文:SQL Server Join方式 0.参考文献 Microsoft SQL Server企业级平台管理实践 看懂SqlServer查询计划 1.测试数据准备 参考:Sql Server中的表访 ...

  9. 浅谈SQL Server中的三种物理连接操作(HASH JOIN MERGE JOIN NESTED LOOP)

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

  10. SQL Server中INNER JOIN与子查询IN的性能测试

    这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...

随机推荐

  1. 学习build-web-application-with-golang第四章内容

    GITHUB网址: https://github.com/astaxie/build-web-application-with-golang 内容 4.表单 4.1 处理表单的输入 4.2 验证表单的 ...

  2. C++构造函数详解(复制构造函数)

    构造函数是干什么的 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员. 构造函数的种类 class Compl ...

  3. Codeforces Round #300 E - Demiurges Play Again

    E - Demiurges Play Again 感觉这种类型的dp以前没遇到过... 不是很好想.. dp[u] 表示的是以u为子树进行游戏得到的值是第几大的. #include<bits/s ...

  4. volatile 的一个经典例子

    volatile 关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被 volatile 修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程 ...

  5. karma配置文件参数介绍

    目录结构 参数介绍 /*** * Created by laixiangran on 2015/12/22. * karma单元测试配置文件 */ module.exports = function( ...

  6. 通过NVM安装node

    NVM(Node version manager)顾名思义,就是Node.js的版本管理软件,可以轻松的在Node.js各个版本间切换,项目源码GitHub 1.下载并安装NVM脚本 curl htt ...

  7. JS 汉字与Unicode码的相互转化

    js文件中,有些变量的值可能会含有汉字,画面引入js以后,有可能会因为字符集的原因,把里面的汉字都变成乱码.后来发现网上的一些js里会把变量中的汉字都表示成”\u“开头的16进制编码,这样应该可以解决 ...

  8. 表A中一条记录的两个字段都对应于表B的同一个字段 如何查询?SQL, thinkphp[5]

    表  A=approval_order, B=admin,  表A中technician_username, salesman_username 都是id号,中文名保存在admin表的nickname ...

  9. Sharepoint 2010 TimerJob重复

    昨天被TimerJob困扰了一天.原因就是TimerJob当中会有一个Httpwebrequest GET请求一个Application Page进行一些操作(其中有一个操作是发送邮件).但是发现随机 ...

  10. docker chown: changing ownership of '/var/lib/XXX': Permission denied

    Links: 1.entos7下docker Permission denied 2.查看 SELinux状态及关闭SELinux 方法: 1.查看SELinux状态sestatus -vgetenf ...