逻辑查询处理的各个阶段
sqlserver select 执行顺序
(5) select (5-2) distinct(5-3) top (<top_specification>)(5-1)<select_list>
(1) from(1-j)<left_table> <join_type>join <right_table> on <on_predicate>
|(1-a)<left_table> <apply_type> apply <right_table_experssion> as <alias>
|(1-p)<left_table> pivot(<pivot_spectification>) as <alias>
|(1-u)<left_table> unpivot unpivot(<unpivot_specification>) as <alias>
(2) where <where_predicate>
(3) group by <group_by_specification>
(4) having <having_precification>
(6) order by <order_by_list>
逻辑查询阶段简介
1-->From :此阶段标识出要查询的来源表,处理表运算符,每个表运算符也会应用一系列子阶段。例如:在联接运算符中涉及到的阶段是笛卡尔积,On筛选器和添加外部行。并生成虚拟表供下一个操作步骤;
1.1-->笛卡尔积:此阶段将两个表的数据进行交叉联接,并生成虚拟表
1.2-->on筛选器:根据中的条件来筛选笛卡尔积虚拟表中的数据,并将满足条件的数据插入到新的虚拟表中
1.3-->添加外部行:如果指定了OUTER JOIN(相对于CROSS JOIN 或INNER JOIN),则将保留表中没有找到匹配的行,插入笛卡尔积虚拟表中,并将生 成新的虚拟表,进一步操作
2-->Where 操作 此阶段根据where子句中出现的谓词对满足on操作后保留的虚拟表进行条件筛选。将满足条件的数据插入到新的虚拟表中
3-->Group By 按照group by 中指定的列名列表将where操作后的虚拟中的数据进行分组,最终每个分组只有一个数据行,
4-->Having 对分组后的数据进行再一次条件筛选,并生成新的虚拟表,
5-->Select 处理select 子句中的元素
5.1-->计算select子句中的表达式
5.2-->Distinct 删除having后的重复数据
5.3-->TOP 根据order by 子句中定义的逻辑顺序,从前面操作的虚拟数据表中提取相应的记录数据
6-->Order By 根据order by 子句中指定的列名列表对数据进行排序,并生成游标