加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

SQL查询语句的执行次序理会

发布时间:2019-11-30 20:25:17 所属栏目:编程 来源:软件测试开发技术栈
导读:SQL语句执行次序 团结上图,清算出如下伪SQL查询语句。 从这个次序中我们可以发明,全部的查询语句都是从 FROM 开始执行的。在现实执行进程中,每个步调城市为下一个步调天生一个假造表,这个假造表将作为下一个执行步调的输入。 接下来,我们具体的先容下
副问题[/!--empirenews.page--]

  SQL语句执行次序

SQL查询语句的执行次序理会

团结上图,清算出如下伪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。保存表如下:

  • LEFT OUTER JOIN把左表记为保存表
  • RIGHT OUTER JOIN把右表记为保存表
  • FULL OUTER JOIN把阁下表都作为保存表

在假造表 VT2表的基本上添加保存表中被过滤前提过滤掉的数据,非保存表中的数据被赋予NULL值,最后天生假造表 VT3。

假如FROM子句包括两个以上的表,则对上一个联接天生的功效表和下一个表一再执行步调1~3,直处处理赏罚完全部的表为止。

4 WHERE 应用WEHRE过滤器

对假造表 VT3应用WHERE筛选器。按照指定的前提对数据举办筛选,并把满意的数据插入假造表 VT4。

  • 因为数据还没有分组,因此此刻还不能在WHERE过滤器中行使聚合函数对分组统计的过滤。
  • 同时,因为还没有进队列的选取操纵,因此在SELECT中行使列的别名也是不被应承的。
5 GROUP BY 分组

按GROUP BY子句中的列/列表将假造表 VT4中的行独一的值组合成为一组,天生假造表VT5。假如应用了GROUP BY,那么后头的全部步调都只能获得的假造表VT5的列可能是聚合函数(count、sum、avg等)。缘故起因在于最终的功效齐集只为每个组包括一行。

同时,从这一步开始,后头的语句中都可以行使SELECT中的别名。

6 AGG_FUNC 计较聚合函数

计较 max 等聚合函数。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 语句在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查询语句的执行次序理会

起首,我们先看下如上SQL的执行次序,如下:

  1. 起首执行 FROM 子句, 从门生后果表中组装数据源的数据。
  2. 执行 WHERE 子句, 筛选门生后果表中全部门生的数学后果不为 NULL 的数据 。
  3. 执行 GROUP BY 子句, 把门生后果表按 "班级" 字段举办分组。
  4. 计较 avg 聚合函数, 按找每个班级分组求出 数学均匀后果。
  5. 执行 HAVING 子句, 筛选出班级 数学均匀后果大于 75 分的。
  6. 执行SELECT语句,返回数据,但别着急,还必要执行后头几个步调。
  7. 执行 ORDER BY 子句, 把最后的功效按 "数学均匀后果" 举办排序。
  8. 执行LIMIT ,限定仅返回3条数据。团结ORDER BY 子句,即返回全部班级中数学均匀后果的前三的班级及其数学均匀后果。

思索一下,假如我们将上面语句改成,如下会奈何?

SQL查询语句的执行次序理会

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读