博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqlserver 中 where 条件和 join 条件的作用比较
阅读量:4584 次
发布时间:2019-06-09

本文共 1743 字,大约阅读时间需要 5 分钟。

从sql server执行计划中分析:

1.where 之后的条件都会用来先过滤各自表的数据(表扫描),输出select 所需要的列;考虑大数据表,使用where过滤出部分数据来关联,提高效率

2.当inner join时,on之后的条件与放在where之后的执行结果相同;

3.当left join 时,表扫描得到的列需要包含on中条件列,on的条件是用来过滤最后显示数据时之用;

  如果on中条件是单独有关左表的,那么该条件与放在where之后没有区别,执行计划基本相同;

  如果on条件是单独有关右表的,那么该条件与放在where之后有明显区别,因为放在该条件放在where之后,等同于该连接变成inner join

 

重要:换个角度,个人见解来表达上述不同情形,可能更清晰,左连接是先连接,取左边所有记录行,然后关联上右边有的行,没有关联行的栏位补空;然后通过where条件过滤已经关联的结果,显示最后的结果。

 

下面是转帖一个例子

1、where 条件 和 inner join 条件 起的作用是一样的。

2、如果where 条件 + Left join 条件 进行组合,其实际跟 inner join 效果一样,

     如:使用sqlserver 教学用的 Northwind 数据库,我想统计一下 某段时间内 各客户的运费情况,比较以下sql查询语句的结果:

语句1).

select Customers.CustomerID, sum(Orders.Freight)
 from Customers 
  left join Orders  on Customers.CustomerID = Orders.CustomerID 
  where Orders.OrderDate between '2010-01-01' and  '2010-02-01'
 group by Customers.CustomerID

 order by Customers.CustomerID

语句2).

select Customers.CustomerID, sum(Orders.Freight)

 from Customers 
  left join Orders  on Customers.CustomerID = Orders.CustomerID and Orders.OrderDate between  '2010-01-01' and  '2010-02-01'
 group by Customers.CustomerID
 order by Customers.CustomerID

 

我使用了 Orders  表中不会存在记录的时间段 2010-1-1 到 2010-2-1,主要是为了突出结果的对比

使用语句1) ,返回0条记录,并不是我想要的统计结果,

使用语句2) ,返回91条记录,这就是我想要的统计结果。

 

我在语句1)中也用了左连接啊,那么为什么语句1)和语句2)得到结果完全不一样呢?我想很多人是使用语句1)的方式来构造 sql查询语句的,和我一样有相同的疑问。

 

使用sql查询分析器里的显示执行计划功能,我们很容易可以看到语句1)跟语句3) 执行的处理过程是一摸一样的

语句3)

select Customers.CustomerID, sum(Orders.Freight)

 from Customers 
  inner join Orders  on Customers.CustomerID = Orders.CustomerID  and Orders.OrderDate between '2010-01-01' and  '2010-02-01'
 group by Customers.CustomerID

 order by Customers.CustomerID

 

答案就是:where 条件 + Left join 条件 进行组合的话,其实际跟 inner join 效果一样

 

所以当使用left join进行查询时,应该使用 语句2)的方式进行语句构造。

转载于:https://www.cnblogs.com/oisiv/archive/2012/02/28/2371437.html

你可能感兴趣的文章
通过Repeater控件绑定数据,相同数据合并单元格。
查看>>
h5 和之前版本的区别
查看>>
【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)
查看>>
【FFT&NTT 总结】
查看>>
洛谷——P1802 5倍经验日
查看>>
leetcode121—Best Time to Buy and Sell Stock
查看>>
【系统优化】为系统提速,何须重装
查看>>
让Chrome 接管邮件连接,收发邮件更方便了
查看>>
cmd 编码 utf8
查看>>
jquery-file-upload demo
查看>>
第一期_Nor Flash
查看>>
oracle 10g
查看>>
ecshop那些事
查看>>
Oracle复制表结构及数据
查看>>
javaweb实现添加课程
查看>>
andriod jbox2d学习笔记二 通过移动关节移动body
查看>>
python列表-简单操作
查看>>
NYOJ题目97兄弟郊游问题
查看>>
IIS web.config拒绝访问 未能开始监视对 XX 文件的更改
查看>>
Opengl编程指南第二章:状态管理、几何绘图
查看>>