sqlserver 中 where 条件和 join 条件的作用比较
2012-02-28 13:44
369 查看
从sql server执行计划中分析:
1.where 之后的条件都会用来先过滤各自表的数据(表扫描),输出select 所需要的列;考虑大数据表,使用where过滤出部分数据来关联,提高效率
2.当inner join时,on之后的条件与放在where之后的执行结果相同;
3.当left join 时,表扫描得到的列需要包含on中条件列,on的条件是用来过滤最后显示数据时之用;
如果on中条件是单独有关左表的,那么该条件与放在where之后没有区别,执行计划基本相同;
如果on条件是单独有关右表的,那么该条件与放在where之后有明显区别,因为放在该条件放在where之后,等同于该连接变成inner join
重要:换个角度,个人见解来表达上述不同情形,可能更清晰,左连接是先连接,取左边所有记录行,然后关联上右边有的行,没有关联行的栏位补空;然后通过where条件过滤已经关联的结果,显示最后的结果。
下面是转帖一个例子
http://archive.cnblogs.com/a/1639665/
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)的方式进行语句构造。
1.where 之后的条件都会用来先过滤各自表的数据(表扫描),输出select 所需要的列;考虑大数据表,使用where过滤出部分数据来关联,提高效率
2.当inner join时,on之后的条件与放在where之后的执行结果相同;
3.当left join 时,表扫描得到的列需要包含on中条件列,on的条件是用来过滤最后显示数据时之用;
如果on中条件是单独有关左表的,那么该条件与放在where之后没有区别,执行计划基本相同;
如果on条件是单独有关右表的,那么该条件与放在where之后有明显区别,因为放在该条件放在where之后,等同于该连接变成inner join
重要:换个角度,个人见解来表达上述不同情形,可能更清晰,左连接是先连接,取左边所有记录行,然后关联上右边有的行,没有关联行的栏位补空;然后通过where条件过滤已经关联的结果,显示最后的结果。
下面是转帖一个例子
http://archive.cnblogs.com/a/1639665/
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)的方式进行语句构造。
相关文章推荐
- sqlserver 中 where 条件和 join 条件的作用比较
- SQL SERVER inner join on 和where条件的作用范围
- [SqlServer] 性能优化实战-join与where条件执行顺序
- Oracle left join 和 where 条件应用时的效率研究
- JOIN关联表中ON,WHERE后面跟条件的区别
- left join on 和where条件的放置
- MySQL 中 left join on 后面的条件与 where 后面的条件的区别
- sqlserver中where条件加判断
- left join on 和where条件的放置
- hive join on和where条件之间的区别
- left join on 和where条件的放置
- mysql join on 后面条件与where条件
- 用SQLite执行join操作时,筛选条件应当写在WHERE后面
- SQLServer inner join 不先执行where条件的优化
- 外连接 ON 条件的三个作用及与 WHERE 的区别
- PostgreSQL join where 条件不同 explain 执行计划的差别
- 性能优化实战-join与where条件执行顺序
- left join on 和where条件的放置
- JOIN ON后面的过滤条件和where后面的过滤条件有什么不同?
- SQL中join on条件和where条件的区别