zoukankan      html  css  js  c++  java
  • [整]SQL执行顺序

    SQL的执行顺序:

    第一步:FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate>

    第二步:WHERE <where_predicate>

    第三步:GROUP BY <group_by_specification>

    第四步:HAVING <having_predicate>

    第五步:SELECT DISTINCT TOP(<top_specification>) <select_list>

    第六步:ORDER BY <order_by_list>

    第一步:FROM 阶段

      FROM阶段标识出查询的来源表,并处理表运算符。在涉及到联接运算的查询中(各种join),主要有以下几个步骤:

      1.求笛卡尔积:不论是什么类型的联接运算,首先都是执行交叉连接(cross join),求笛卡儿积,生成虚拟表VT1-J1。

      2.ON筛选器:这个阶段对上个步骤生成的VT1-J1进行筛选,根据ON子句中出现的谓词进行筛选,让谓词取值为true的行通过了考验,插入到VT1-J2。

      3.添加外部行:如果指定了outer join,还需要将VT1-J2中没有找到匹配的行,作为外部行添加到VT1-J2中,生成VT1-J3。

    第二步:WHERE阶段

      WHERE阶段是根据<where_predicate>中条件对VT1中的行进行筛选,让条件成立的行才会插入到VT2中。

    第三步:GROUP BY阶段

      GROUP阶段按照指定的列名列表,将VT2中的行进行分组,生成VT3。最后每个分组只有一行。

    第四步:HAVING阶段

      该阶段根据HAVING子句中出现的谓词对VT3的分组进行筛选,并将符合条件的组插入到VT4中。

    第五步:SELECT阶段

      这个阶段是投影的过程,处理SELECT子句提到的元素,产生VT5。这个步骤一般按下列顺序进行

      1.计算SELECT列表中的表达式,生成VT5-1。

      2.若有DISTINCT,则删除VT5-1中的重复行,生成VT5-2

      3.若有TOP,则根据ORDER BY子句定义的逻辑顺序,从VT5-2中选择签名指定数量或者百分比的行,生成VT5-3

    第六步:ORDER BY阶段

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

    原文参考:http://www.cnblogs.com/gaiyang/archive/2011/04/13/2014355.html 

  • 相关阅读:
    FPGA-中值滤波
    FPGA-中值滤波
    FPGA-shift_ram代码
    FPGA实现-shift_ram_3x3矩阵实现
    图像处理-中值滤波
    python-str
    ignore-certificate-errors(chrome)
    selenium-python-Cookie跳过登录验证码
    Angular2
    Angular2
  • 原文地址:https://www.cnblogs.com/dongdong1979/p/4898239.html
Copyright © 2011-2022 走看看