• SQLSERVER 2008 技术内幕 T-SQL查询 笔记1: SQL 执行顺序


    与大多数语言一样,SQL语言也有一个执行顺序,只是在大多数编程语言中,代码是按照编写顺序来处理的,而在SQL中则不是,下图为SQL 执行顺序。

    (5) SELECT ( 5-2 ) [ ALL | DISTINCT ]
               (5- 3) [TOP ( expression ) [PERCENT] [ WITH TIES ]
               (5- 1) < select_list >
        --[ INTO new_table ]
    (1) FROM ( 1-J ) < left_table> <join_type> join <right_table> on <on_predicate>
              |(1- A) <left_table> <apply_type > apply <right_table_expression> as <alias>
              |(1- P) <left_table> PIVOT (<pivot_specification>) as <alias>
              |(1- U) <left_table> UNPIVOT (<unpivot_specification>) as <alias>
    (2) WHERE <search_condition>
    (3) <GROUP BY>
    (4) HAVING < search_condition > 
    (6)    ORDER BY < order_by_list>
    

    (1)FROM  FROM 阶段标识出查询的来源表,处理表运算符。每个表运算符也会应用一系列子阶段。例如,在联接运算中涉及的阶段是(1-J1)笛卡尔积、(1-J2)ON筛选器 和(1-J3) 添加外部行。 FROM 阶段生成虚拟表 VT1

    (1-J1) 笛卡尔积 这个阶段对表运算符涉及的两个表执行笛卡尔积(交叉连接),生成虚拟表 VT1-J1

    (1-J2)ON 筛选器  这个除非对VT1-J1中的行根据ON子句(<on_predicate>)中出现的谓词进行筛选。只有让该谓词取值为true的行,才能插入 VT1-J2中

    (1-J3)添加外部行  如果指定了OUTER JOIN(相对于cross join 或者 inner join ),则将保留表(preserved table) 中没有找到匹配的行,作为外部行添加到VT 1-J2中,生成 VT1- J3.

    (2)WHERE  这个阶段根据在 WHERE 子句中出现的谓词(<where_predicate>)中对 VT1 中的行进行筛选。只有让谓词计算结果为 TRUE 的行,才能插入 VT2 中。

    (3)GROUP BY 按照GROUP BY 子句中指定的列名列表,将 VT2 中的行进行分组,生成 VT3。最终,每个分组只有一个结果行。

    (4)HAVING 根据HAVING 子句中出现的谓词(<having_predicate>) 对VT3中的分组进行筛选。只有让谓词计算结果为TRUE的组,才会插入到VT4

    (5)SELECT 处理SELECT子句中的元素,产生VT5

    (5-1) 计算表达式 计算SELECT 列中的表达式,生成 VT5-1

    (5-2) DISTINCT 删除 VT5-1中的重复行,生成 VT5-2

    (5-3)TOP 根据ORDER BY 子句定义的逻辑排序,从 VT5-2中选择前面指定数量或百分比的行,生成表 VT5-3

    (6) ORDER BY  根据 ORDER BY 子句中指定的列名列表,对 VT5-3中的行进行排序,生成游标 VC6

  • 相关阅读:
    KM算法(带权二分图最优匹配)
    I'm Telling the Truth(二分图最大匹配) HDU
    过山车(二分图匹配裸题) HDU
    locker(dp) HDU
    Hunters(期望,数学) HDU
    Sum of divisors(进制转换) HDU
    DataTable 内数据搜索
    NPOI 读取xls,xlsx文件
    (转)C#将多个DLL集成到EXE文件中的方法
    saveFileDialog简单使用
  • 原文地址:https://www.cnblogs.com/zerocc/p/3248880.html
Copyright © 2020-2023  润新知