SQL子查询执行的顺序问题



SQL子查询执行的顺序问题.

以下是代码片段:
(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
还是……
避免使用HAVING 子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE 子句限制记录的数目,那就能减少这方面的开销. (非oracle 中)on、where、having 这三个都可以加条件的子句中,on 是最先执行,where 次之,having 最后,因为on 是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的, where 也应该比having 快点的,因为它过滤数据后才进行sum,在两个表联接时才用on 的,所以在一个表的时候,就剩下where跟having 比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where 可以使用rushmore 技术,而having 就不能,在速度上后者要慢如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where 的作用时间是在计算之前就完成的,而having 就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时, on 比where 更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having 进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里
相关文章
用PHP和MySQL保存和输出图片
用MySQL内建复制来最佳化可用性(七)
用MySQL内建复制来最佳化可用性(六)
用MySQL内建复制来最佳化可用性(五)
用MySQL内建复制来最佳化可用性(四)
用MySQL内建复制来最佳化可用性(三)
用MySQL内建复制来最佳化可用性(二)
用MySQL内建复制来最佳化可用性(一)
T-SQL查询进阶–数据集之间的运算
关键词:子查询,其他数据库,数据库