SQL语句执行顺序


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
 1,FROM阶段
   1)从FROM执行,对于JOIN,两表进行交叉连接,求笛卡尔积得到一个结果集。
   2)根据ON条件,对结果集不满足条件的记录去除
   3)若有外连接,如LEFT,RIGHT等,再将满足条件的加入到结果集中
   4)执行APPLY,PIVOT,UNPIVOT等表达式
2,WHERE阶段:对于1步骤得到的虚表,将where条件为true的保留下来
3,GROUP BY 阶段 对虚拟表进行分组
4,HAVING阶段,对分组后的虚拟表进行筛选
5,SELECT/UPDATE/DELETE阶段,投影取得列数据,若有TOP,则会根据ORDER BY 子句来选择指定数量的行
6,ORDER BY 阶段 对上述结果进行排序,返回游标

由上知:1,GROUP BY 是HAVING的基础,需要先执行GROUP BY 再执行HAVING
        2, WHERE比SELECT先执行,故在SELECT中指定的虚列在WHERE条件中不可用,而SELECT比ORDER BY 先执行,故在SELECT中指定的虚列在ORDER BY条件中可以使用
     SELECT f.UserName,SUM(amount) amo --amo:虚列,指在原有表中不存在的列
     FROM bdOrder
     ORDER BY amo
       3,若使用ORDER BY,则返回的是一个游标,不能用在FROM后面,因为FROM后面跟的是结果集
        SELECT * FROM ( SELECT * FROM frmuser ORDER BY Account )f 这样是错误的
       例外:可通过加TOP解决
    SELECT * FROM ( SELECT TOP * FROM frmuser ORDER BY Account )f
4:当Select未使用Distinct时,Order By可使用Select之前的字段,即:即使在Select中不存在,但在表中存在的字段,Order By也可引用当Select使用Distinct时,Order By只能使用Select中的字段