MS SQL中连接和Where的执行顺序?

木易随风 2011-04-06 02:28:48
在MS SQL中先执行join还是Where?


Select * From A LEFT JOIN B ON A.ID=B.ID WHERE A.DATE BETWEEN '2011-2-1' AND '2011-3-1'

SELECT * FROM (SELECT * FROM A WHERE DATE BETWEEN '2011-2-1' AND '2011-3-1') A LEFT JOIN B ON A.ID=B.ID



这两个语句是第二个执行快,效率高吗?假设A表的记录很多上百万、千万条。

如果是第二个效率高,那是不是尽量的将限定条件放在查询的子层。
...全文
330 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
blue999ice 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
SQL code
SQL Select语句完整的执行顺序:

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。


另外:一个查询语句……
[/Quote]
很全面很精辟,学习了
张飞不刮胡子 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
SQL code
SQL Select语句完整的执行顺序:

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。


另外:一个查询语句……
[/Quote]
很详细。 Inside sql也这么说的。
ask_chang 2011-04-07
  • 打赏
  • 举报
回复

Select * From A LEFT JOIN B ON A.ID=B.ID WHERE A.DATE BETWEEN '2011-2-1' AND '2011-3-1'
先Join连接,后判断Where条件

SELECT * FROM (SELECT * FROM A WHERE DATE BETWEEN '2011-2-1' AND '2011-3-1') A LEFT JOIN B ON A.ID=B.ID

先执行括号里面的Select语句,后Join连接

Shawn 2011-04-07
  • 打赏
  • 举报
回复
--顺序参考#3楼
--效率的话,经过优化器优化后,应该是一样的.
幸运的意外 2011-04-07
  • 打赏
  • 举报
回复
根据理论说明:SQL Server先进行join 操作再运用on条件,最后是where
vivai2010 2011-04-07
  • 打赏
  • 举报
回复
先join 后where
cs_lb 2011-04-07
  • 打赏
  • 举报
回复
先JOIN
后where

可以比较下ON 后面跟过滤条件
和where后面跟过滤条件 对比测试
lhblxm 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 rucypli 的回复:]
先where过滤 然后join
[/Quote]
我也是这样认为的
zp975800 2011-04-07
  • 打赏
  • 举报
回复
先join再where 再group by 再having
叶子 2011-04-07
  • 打赏
  • 举报
回复
对于此种情况,两种写法估计效率上差不多
liaochao1021 2011-04-07
  • 打赏
  • 举报
回复
同意上楼,先join后where
gw6328 2011-04-07
  • 打赏
  • 举报
回复
先join 后where吧
Rotel-刘志东 2011-04-06
  • 打赏
  • 举报
回复
新执行的join,然后再执行where
--小F-- 2011-04-06
  • 打赏
  • 举报
回复
SQL Select语句完整的执行顺序: 

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。


另外:一个查询语句各个部分的执行顺序:
--8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
--(1) FROM <left_table>
--(3) <join_type> JOIN <right_table>
--(2) ON <join_condition>
--(4) WHERE <where_condition>
--(5) GROUP BY <group_by_list>
--(6) WITH {CUBE | ROLLUP}
--(7) HAVING <having_condition>
--(10) ORDER BY <order_by_list>
rucypli 2011-04-06
  • 打赏
  • 举报
回复
先where过滤 然后join
kingtiy 2011-04-06
  • 打赏
  • 举报
回复
1.先执行join
2.顺序没有关系.

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧