SQL的语句执行顺序

时间:2022-11-23 03:40:54
SQL语句的执行分为很多个步骤,每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。
MySQL的SQL语句执行步骤:
FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
ON:
对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。
JOIN:
如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3,
rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。


SQL server的SQL语句执行步骤:
FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
ON:
对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
OUTER(JOIN):
如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标
记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生
成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.SELECT:处理SELECT列表,产生VT8.DISTINCT:将重复的行从VT8中移除,产生VT9.ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。


Oracle的SQL语句执行步骤:
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。