关于sql server中的 jion,inner join, left join ,left outer join, right join,right outer join 的几点使用心得

平时我们做关联,一般都是2~3张表,不太关注这样繁杂的写法,那今天咱们就看看这些写法吧

对将要说的这三种,先说一下要介绍的要点:on后面的条件可以放几个?什么时候结合着where条件一起使用?

大家可以先看看这个帖子,帖子的名字是:sqlserver left join的on中如何添加多个查询条件??

链接:http://bbs.csdn.net/topics/270023422

开始咱们的介绍吧

首先对于join 分三块:

1.  join 、join inner (内联)

我们平时的写法是:

<span style="font-size:14px;">SELECT * FROM A
JOIN B ON A.ID=B.ID </span>

直接写 join,这样的写法其实就是 inner join ,

on后面就是我们说的条件,后面可以跟多个条件

SELECT TOP 1000 *
  FROM [DB0208].[dbo].[Orders] o
  JOIN [DB0208].[dbo].[BaseOrderStatus] b
  ON o.Status=b.StatusCode AND b.StatusCode=8
  AND o.ProductId='660016'

这种写法是正确的,当然也可以把条件放到where里面

如下写法:

 SELECT TOP 1000 *
  FROM [DB0208].[dbo].[Orders] o
   JOIN [DB0208].[dbo].[BaseOrderStatus] b
  ON o.Status=b.StatusCode
  WHERE  o.ProductId='660016' AND  b.StatusCode=8

查询结果:

2.  left join ,left outer join(左连接)

left join 叫左连接,left outer join叫左外连接,其实是一种,

后面的on,如果没有where条件,on后面只能跟一个关联条件,把之后的条件都加到where里面

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

查看如下写法:

SELECT TOP 1000 *
  FROM [DB0208].[dbo].[Orders] o
  LEFT JOIN [DB0208].[dbo].[BaseOrderStatus] b
  ON o.Status=b.StatusCode AND b.StatusCode=8
  AND o.ProductId='660016'

这种写法就是错误,因为第二条件on已经不起作用了,查询结果:

正确的写法:

  SELECT TOP 1000 *
  FROM [DB0208].[dbo].[Orders] o
  JOIN [DB0208].[dbo].[BaseOrderStatus] b
  ON o.Status=b.StatusCode
  WHERE b.StatusCode=8 AND o.ProductId='660016'

当然也可以这么写:

  SELECT TOP 1000 *
  FROM [DB0208].[dbo].[Orders] o
  JOIN [DB0208].[dbo].[BaseOrderStatus] b
  ON o.Status=b.StatusCode AND <span style="font-family: Arial, Helvetica, sans-serif;">b.StatusCode=8 AND</span>
  WHERE  o.ProductId='660016'

就是说,有where条件控制,on后面可以用多个 条件,查询结果就和第一张截图内容一样了

3. right join,right outer join (右连接)

right join 叫右连接,right outer join叫右外连接,其实是一种,

后面的on,也只能跟一个关联条件,和left join是一样的。

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

3和2类似,就不再赘述啦。

-------------------------------------

这些是一个小同事问我的,之前一直都想整理,现在就把它写出来,让大家参考,以后有新人再问相关问题,直接给他链接就好了,东西在于精,学习一次,在以后的反复练习中才能掌握。

时间: 2024-10-25 20:35:29

关于sql server中的 jion,inner join, left join ,left outer join, right join,right outer join 的几点使用心得的相关文章

SQL Server中的执行引擎入门

简介 当查询优化器(Query Optimizer)将T-SQL语句解析后并从执行计划中选择最低消耗的执行计划后,具体的执行就会交由执行引擎(Execution Engine)来进行执行.本文旨在分类讲述执行计划中每一种操作的相关信息. 数据访问操作 首先最基本的操作就是访问数据.这既可以通过直接访问表,也可以通过访问索引来进行.表内数据的组织方式分为堆(Heap)和B树,其中表中没有建立聚集索引时数据是通过堆进行组织的,这个是无序的,表中建立聚集索引后和非聚集索引的数据都是以B树方式进行组织,

SQL Server中TOP子句可能导致的问题以及解决办法

原文:SQL Server中TOP子句可能导致的问题以及解决办法 简介      在SQL Server中,针对复杂查询使用TOP子句可能会出现对性能的影响,这种影响可能是好的影响,也可能是坏的影响,针对不同的情况有不同的可能性.      关系数据库中SQL语句只是一个抽象的概念,不包含任何逻辑.很多元数据都会影响执行计划的生成,SQL语句本身并不作为生成执行计划所参考的元数据(提示除外),但TOP关键字却是直接影响执行计划的一个关键字,因此在某些情况下使用TOP会导致性能受到影响,下面我们来

在SQL Server中为什么不建议使用Not In子查询

原文:在SQL Server中为什么不建议使用Not In子查询     在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下       下面我们来看一下为什么尽量不使用Not In子句.   结果不准确问题     在SQL Server中,Null值并不是一个值,而是表示特定含义,其所表示的含义是"Unknow",可以理解为未定义或者未知,因此任何与Null值

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

SQL Server 中WITH (NOLOCK)浅析

原文:SQL Server 中WITH (NOLOCK)浅析 概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如下所示(摘自MSDN): 1: 指定允许脏读.不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻碍当前事务读取锁定数据.允许脏读可能产生较多的并发操作,但其代价是读取以后会被其他事务回滚的数据修改.这可能会使您的

Sql server中根据存储过程中的部分信息查找存储过程名称的方法【视图和Function】

1.查询的语句: select a.id,b.name,a.*,b.* from syscomments a join sysobjects b on a.id=b.id where b.xtype='P' and a.text like '%usp_cm%' b.xtype='P'指定在什么类型的范围进行搜索 '%usp_cm%'就是你能记得的存储过程中的内容. 2.查找类型: select distinct xtype from sysobjects 找到数据库中所有的对象类型 P是存储过程

为什么SQL语句Where 1=1 and在SQL Server中不影响性能

    最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响.     虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过程中经常犯得错误就是得出一个很窄的结论,然后教条式的奉若圣经,对于T-SQL领域来说,在网上经常可以看到所谓的优化守则,随便在网上搜了一些摘录如下: 不要有超过5个以上的表连接(JOIN) 考虑使用临时表或表变量存放中间结果 少用子查询 视图嵌套不要过深,一般视图嵌套不要超过2个为宜. 对出现在wh

SQL Server中关于跟踪(Trace)那点事

前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简单的举几个应用场景: 在线生产库为何突然宕机?数百张数据表为何不翼而飞?刚打好补丁的系统为何屡遭黑手?新添加的信息表为何频频丢失?某张表字段的突然更改,究竟为何人所为?这些个匿名的访问背后,究竟是人是鬼?突然增加的增量数据,究竟是对是错?数百兆的日志爆炸式的增长背后又隐藏着什么?这一且的背后,是应用

理解SQL SERVER中的分区表(转)

简介 分区表是在SQL SERVER2005之后的版本引入的特性.这个特性允许把逻辑上的一个表在物理上分为很多部分.而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个表做union操作. 分区表在逻辑上是一个表,而物理上是多个表.这意味着从用户的角度来看,分区表和普通表是一样的.这个概念可以简单如下图所示: 而对于SQL SERVER2005之前的版本,是没有分区这个概念的,所谓的分区仅仅是分布式视图: 本篇文章所讲述的分区表指的是SQL SERVER2005之