子查询执行的顺序问题

fyming 2009-07-29 05:33:03
加精
(1) select * from t1 a

(2) left join(select * from t2 where ……)b
(3) on a.f1=b.f1

(4) where a.f2 ……
-------------------------------------------------
问题:
执行顺序是 2、3、4、1
还是 4、1、2、3
还是……
...全文
2218 94 打赏 收藏 转发到动态 举报
写回复
用AI写文章
94 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharpidd 2009-08-02
  • 打赏
  • 举报
回复
学习了.
越过越咸 2009-08-02
  • 打赏
  • 举报
回复
一个帖子引发的技术
华芸智森 2009-08-01
  • 打赏
  • 举报
回复
我意识里觉得这样,如果不先WHERE再JOIN,那JOING出来的结果太大了.SQL的优化难道不会考虑这个.
:)
华芸智森 2009-08-01
  • 打赏
  • 举报
回复
曾被人问过这个问题,我回答是先 WHERE . 后 JOIN . 再 SELECT .
面试的人说是先 JOIN 后 WHERE 再 SELECT .
其实这样的问题十有八九的人都答不出来.除非你真的看过某本这样的书.

czx33859066 2009-08-01
  • 打赏
  • 举报
回复
MARK
r_swordsman 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 86 楼 mstop 的回复:]
我意识里觉得这样,如果不先WHERE再JOIN,那JOING出来的结果太大了.SQL的优化难道不会考虑这个.
:)
[/Quote]

就是,那些说先JOIN的只不过的在想当然,唉,人家甲骨文,微软,IBM的人有那么白痴不?
而且我在 48,49 楼也给出测试结果了,也证明先WHERE,

这些人想当然到没什么,有想法嘛. 可怎么就不去测试一下呢? 难怪技术差,只猜想不动手
舷Kelvin 2009-08-01
  • 打赏
  • 举报
回复
mark..
nrain01 2009-08-01
  • 打赏
  • 举报
回复
最先执行里层的吧。
fyming 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 86 楼 mstop 的回复:]
我意识里觉得这样,如果不先WHERE再JOIN,那JOING出来的结果太大了.SQL的优化难道不会考虑这个.
:)
[/Quote]

94,写SQL时,经常可以遇到筛选条件既可以放到子查询中,也可以放到外层里where,是从里向外过滤数据效率高呢?还是从外向里过滤数据效率高呢?这正是本贴的初衷所在。
stszd604 2009-08-01
  • 打赏
  • 举报
回复
粗浅的认为 2 3 4 1
japhie 2009-07-31
  • 打赏
  • 举报
回复
顺序应该是2341
davidliulee 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 nocallstle 的回复:]
1.FROM:对FROM子句中前两个表执行笛卡尔积 生成虚拟表VT1
2.ON:对VT1表应用ON筛选器 只有满足 <join_condition>为真的行才被插入VT2
3.OUTER(JOIN):如果指定了OUTER JOIN 保留表(preserved table)中未找到的行将行作为外部行添加到VT2 生成T3
如果FROM包含两个以上表 则对上一个联结生成的结果表和下一个表重复执行步骤1和步骤3 直接结束
4.WHERE:对VT3应用WHERE筛选器 只有使 <where_condition>为TRUE的行才被插入VT4
5.GROUP BY:按GROUP BY子句中的列列表 对VT4中的行分组 生成VT5
6.CUBE|ROLLUP:把超组(Supergroups)插入VT6 生成VT6
7.HAVING:对VT6应用HAVING筛选器 只有使 <having_condition>为TRUE的组才插入VT7
8.SELECT:处理SELECT列表 产生VT8
9.DISTINCT:将重复的行从VT8中去除 产生VT9
10.ORDER BY:将VT9的行按ORDER BY子句中的列列表排序 生成一个游标 VC10
11.TOP:从VC10的开始处选择指定数量或比例的行 生成VT11 并返回调用者
[/Quote]
顶!
davidliulee 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 csdyyr 的回复:]
--查询的逻辑执行过程,来自技术内幕
(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>

[/Quote]
这是查询语法,不是执行顺序
gsk09 2009-07-31
  • 打赏
  • 举报
回复
4→3→2→1
长安聊IP商业 2009-07-31
  • 打赏
  • 举报
回复


你类比一下 , 原则是先父查询再子查询
例如;
1.条件子查询

select * from stu where classId in (select classId from shool where schoolname = '一中')
查询的顺序是 A.select * from stu
B. select classId from shool where shoolname = '一中'
再从A中选出 stu 是 "一中"的学生信息

ArayChou 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xiequan2 的回复:]
在sql server中负责生成实际工作计划的组件是查询优化器,以何种方式访问表,使用那种方式和那个索引,应用那种联接算法等都是由优化器来决定的,优化器会生成多个有效的执行计划,并选择其中成本最低的执行计划,逻辑查询处理中的各个阶段都有着特定的顺序,但是,优化器却经常在它生成的物理执行计划中走捷径,为了使用索引,优化器可能会决定使用一个比逻辑处理所规定的筛选器快得多的筛选器
[/Quote]

这个才是正解,一个sql语句的执行顺序(专业术语:执行计划)可能有很多组合,数据库会自动判断哪一个执行顺序。

如果一个数据库在任何情况对于一个sql语句的执行顺序都是一样,那么,这个数据库太落后,我想现在没有这样的数据库
索引在线 2009-07-31
  • 打赏
  • 举报
回复
执行顺序应该是按照一般编程语言的顺序执行吧。
YHL27 2009-07-31
  • 打赏
  • 举报
回复
sf!
Jamin_Liu 2009-07-30
  • 打赏
  • 举报
回复
(5)select *
(1)from t1 a

(3)left join(select * from t2 where ……)b
(2) on a.f1=b.f1

(4) where a.f2 ……
alisafan123 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 csdyyr 的回复:]
逻辑执行过程 <>物理执行过程
[/Quote]
对的
加载更多回复(72)

34,590

社区成员

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

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