拓冰建站拓冰建站
首页 / 资讯中心 / 正文

sql的执行顺序(经典收藏)

上图明确的指出了sql 的执行顺序。上图模拟了一个可执行脚本在实际执行过程中每个步骤都会为下一个步骤生成一个虚拟表这个虚拟表将作为下一个执行步骤的输入。 接下来我们详细的介绍下每个步骤的具体执行过程。1 FROM 查询表数据执行笛卡尔积FROM 是 SQL 语句执行的第一步from子句识别查询表的数据对FROM子句中的前两个表执行笛卡尔积(交叉联接生成虚拟表VT1获取不同数据源的数据集。FROM后面的表关联是自右向左解析的from后面需要接多个表尽量把数据量小的表放在最右边来进行关联即小表驱动大表2 ON 应用ON过滤器对虚拟表VT1应用ON筛选器ON 中的逻辑表达式将应用到虚拟表VT1中的各个行筛选出满足ON 逻辑表达式的行生成虚拟表VT2。3 JOIN 添加外部行如果指定了OUTER JOIN保留表中未找到匹配的行将作为外部行添加到虚拟表VT2生成虚拟表VT3。保留表如下LEFT OUTER JOIN把左表记为保留表左连接RIGHT OUTER JOIN把右表记为保留表右连接FULL OUTER JOIN把左右表都作为保留表内连接在虚拟表VT2表的基础上添加保留表中被过滤条件过滤掉的数据非保留表中的数据被赋予NULL值最后生成虚拟表VT3。如果FROM子句包含两个以上的表则对上一个联接生成的结果表和下一个表重复执行步骤1~3直到处理完所有的表为止。4 WHERE 应用WEHRE过滤器对虚拟表VT3应用WHERE筛选器。根据指定条件对数据进行筛选并把满足的数据插入虚拟表VT4。where条件的解析顺序是自下而上的把能筛选出小量数据的条件放在where语句的最左边PSWHERE后不可用别名不能使用聚合函数5 GROUP BY 分组按GROUP BY子句中的列/列表将虚拟表VT4中的行唯一的值组合成为一组生成虚拟表VT5。如果应用了GROUP BY非聚合字段必须出现在GROUP BY子句中或在聚合函数中使用。PS从这一步开始后面的语句中都可以使用SELECT中的别名。6 AGG_FUNC 计算聚合函数SQL Aggregate 计算聚合函数函数计算从列中取得的值返回一个单一的值。常用的 Aggregate 函数包涵以下几种AVG返回平均值COUNT返回行数FIRST返回第一个记录的值LAST返回最后一个记录的值MAX 返回最大值MIN返回最小值SUM 返回总和7 WITH 应用ROLLUP或CUBE对虚拟表VT5应用ROLLUP或CUBE选项生成虚拟表VT6。CUBE 和 ROLLUP 区别如下CUBE 生成的结果数据集显示了所选列中值的所有组合的聚合。ROLLUP 生成的结果数据集显示了所选列中值的某一层次结构的聚合。8 HAVING 应用HAVING过滤器对虚拟表VT6应用HAVING筛选器。根据指定的条件对数据进行筛选并把满足的数据插入虚拟表VT7。HAVING 中可以是普通条件的筛选也能是聚合函数HAVING语句在SQL中的主要作用与WHERE语句作用是相同的但是HAVING是过滤聚合值在 SQL 中增加 HAVING 子句原因就是WHERE 关键字无法与聚合函数一起使用HAVING子句主要和GROUP BY子句配合使用。9 SELECT 选出指定列将虚拟表VT7中的在SELECT中出现的列筛选出来并对字段进行处理展示计算SELECT子句中的表达式产生虚拟表VT8。10 DISTINCT 行去重将重复的行从虚拟表VT8中移除产生虚拟表VT9。DISTINCT用来去除重复行只保留唯一的。仅仅去重distinct 没有 group by效率高group by应用的范围更广泛一些。11 ORDER BY 排序执行order by 将数据按照一定顺序排序将虚拟表VT9中的行按ORDER BY 子句中的列/列表排序生成游标VC10注意不是虚拟表。因此使用 ORDER BY 子句查询不能应用于表达式。同时ORDER BY子句的执行顺序为从左到右排序是非常消耗资源的。执行order by 将数据按照一定顺序排序12 LIMIT/OFFSET 指定返回行从VC10的开始处选择指定数量行生成虚拟表VT11并返回调用者。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门