SQL查询语句的执行次序理会
副问题[/!--empirenews.page--]
SQL语句执行次序 团结上图,清算出如下伪SQL查询语句。 从这个次序中我们可以发明,全部的查询语句都是从 FROM 开始执行的。在现实执行进程中,每个步调城市为下一个步调天生一个假造表,这个假造表将作为下一个执行步调的输入。 接下来,我们具体的先容下每个步调的详细执行进程。 1 FROM 执行笛卡尔积FROM 才是 SQL 语句执行的第一步,并非 SELECT 。对FROM子句中的前两个表执行笛卡尔积(交错联接),天生假造表VT1,获取差异数据源的数据集。 FROM子句执行次序为从后往前、从右到左,FROM 子句中写在最后的表(基本表 driving table)将被最先处理赏罚,即最后的表为驱动表,当FROM 子句中包括多个表的环境下,我们必要选择数据起码的表作为基本表。 2 ON 应用ON过滤器对假造表VT1 应用ON筛选器,ON 中的逻辑表达式将应用到假造表 VT1中的各个行,筛选出满意ON 逻辑表达式的行,天生假造表 VT2 。 3 JOIN 添加外部行假如指定了OUTER JOIN保存表中未找到匹配的行将作为外部行添加到假造表 VT2,天生假造表 VT3。保存表如下:
在假造表 VT2表的基本上添加保存表中被过滤前提过滤掉的数据,非保存表中的数据被赋予NULL值,最后天生假造表 VT3。 假如FROM子句包括两个以上的表,则对上一个联接天生的功效表和下一个表一再执行步调1~3,直处处理赏罚完全部的表为止。 4 WHERE 应用WEHRE过滤器对假造表 VT3应用WHERE筛选器。按照指定的前提对数据举办筛选,并把满意的数据插入假造表 VT4。
按GROUP BY子句中的列/列表将假造表 VT4中的行独一的值组合成为一组,天生假造表VT5。假如应用了GROUP BY,那么后头的全部步调都只能获得的假造表VT5的列可能是聚合函数(count、sum、avg等)。缘故起因在于最终的功效齐集只为每个组包括一行。 同时,从这一步开始,后头的语句中都可以行使SELECT中的别名。 6 AGG_FUNC 计较聚合函数计较 max 等聚合函数。SQL Aggregate 函数计较从列中取得的值,返回一个单一的值。常用的 Aggregate 函数包容以下几种:
对假造表 VT5应用ROLLUP或CUBE选项,天生假造表 VT6。 CUBE 和 ROLLUP 区别如下:
对假造表VT6应用HAVING筛选器。按照指定的前提对数据举办筛选,并把满意的数据插入假造表VT7。 HAVING 语句在SQL中的首要浸染与WHERE语句浸染是沟通的,可是HAVING是过滤聚合值,在 SQL 中增进 HAVING 子句缘故起因就是,WHERE 要害字无法与聚合函数一路行使,HAVING子句首要和GROUP BY子句共同行使。 9 SELECT 选出指定列将假造表 VT7中的在SELECT中呈现的列筛选出来,并对字段举办处理赏罚,计较SELECT子句中的表达式,发生假造表 VT8。 10 DISTINCT 行去重将一再的行从假造表 VT8中移除,发生假造表 VT9。DISTINCT用来删除一再行,只保存独一的。 11 ORDER BY 分列将假造表 VT9中的行按ORDER BY 子句中的列/列表排序,天生游标 VC10 ,留意不是假造表。因此行使 ORDER BY 子句查询不能应用于表达式。同时,ORDER BY子句的执行次序为从左到右排序,长短常耗损资源的。 12 LIMIT/OFFSET 指定返回行从VC10的开始处选择指定命量行,天生假造表 VT11,并返回挪用者。 实例接下来,我们看一个实例,以下SQL查询语句是否存在题目? 起首,我们先看下如上SQL的执行次序,如下:
思索一下,假如我们将上面语句改成,如下会奈何? (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |