MySQL - 一文解析 SQL 的执行顺序

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
全局流量管理 GTM,标准版 1个月
简介: MySQL - 一文解析 SQL 的执行顺序

这篇文章主要介绍关于 SQL 的执行顺序是怎样的,SQL 在执行顺序中最先执行的是 FROM 操作,最后执行 LIMIT;在执行每一个操作的时候都会产生一张虚拟的表,但执行过程中产生的表不会对用户展示,只有最后一张表作为输出结果呈现给用户。

1. SQL执行过程

select 语句的完整语法如下:

(9)  SELECT
        (10) DISTINCT column,
        (6)  AGG FUNC(column or expression), ...
(1)  FROM left tab1
        (3)  JOIN right tab2
        (2)  ON tab1.column = tab2.column
(4)  WHERE constraint_expression
(5)  GROUP BY column
(7)  WITH CUBE ROLLUP
(8)  HAVING constraint_expression
(11) ORDER BY column ASC|DESC
(12) LIMIT count OFFSET count;

1.1 FROM 执行笛卡尔积

FROM 才是 SQL 语句执行的第一步,并非 SELECT 。对 FROM 子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表 VT1,获取不同数据源的数据集。

FROM 子句执行顺序为从后往前、从右到左,FROM 子句中写在最后的表(基础表 driving table)将被最先处理,即最后的表为驱动表,当 FROM 子句中包含多个表的情况下,我们需要选择数据最少的表作为基础表。

1.2 ON 应用ON过滤器

对虚拟表 VT1 应用 ON 筛选器,ON 中的逻辑表达式将应用到虚拟表 VT1 中的各个行,筛选出满足 ON 逻辑表达式的行,生成虚拟表 VT2

1.3 JOIN 添加外部行

如果指定了 OUTER JOIN 保留表中未找到匹配的行将作为外部行添加到虚拟表 VT2,生成虚拟表 VT3。保留表如下:

  • LEFT OUTER JOIN 把左表记为保留表
  • RIGHT OUTER JOIN 把右表记为保留表
  • FULL OUTER JOIN 把左右表都作为保留表

在虚拟表 VT2 的基础上添加保留表中被过滤条件过滤掉的数据,非保留表中的数据被赋予NULL 值,最后生成虚拟表 VT3

如果 FROM 子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1~3,直到处理完所有的表为止。

1.4 WHERE 应用WEHRE过滤器

对虚拟表 VT3 应用 WHERE 筛选器。根据指定的条件对数据进行筛选,并把满足的数据插入虚拟表 VT4

  • 由于数据还没有分组,因此现在还不能在 WHERE 过滤器中使用聚合函数对分组统计的过滤。
  • 同时,由于还没有进行列的选取操作,因此在 SELECT 中使用列的别名也是不被允许的。

1.5 GROUP BY 分组

按 GROUP BY 子句中的列/列表将虚拟表 VT4 中的行唯一的值组合成为一组,生成虚拟表VT5。如果应用了 GROUP BY,那么后面的所有步骤都只能得到的虚拟表 VT5 的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。

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

1.6 AGG_FUNC 计算聚合函数

计算 max 等聚合函数。SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。常用的 Aggregate 函数包涵以下几种:

  • AVG:返回平均值
  • COUNT:返回行数
  • FIRST:返回第一个记录的值
  • LAST:返回最后一个记录的值
  • MAX: 返回最大值
  • MIN:返回最小值
  • SUM: 返回总和

1.7 WITH 应用ROLLUP或CUBE

对虚拟表 VT5 应用 ROLLU P或 CUBE 选项,生成虚拟表 VT6

CUBE 和 ROLLUP 区别如下:

  • CUBE 生成的结果数据集显示了所选列中值的所有组合的聚合。
  • ROLLUP 生成的结果数据集显示了所选列中值的某一层次结构的聚合。

1.8 HAVING 应用HAVING过滤器

对虚拟表 VT6 应用 HAVING 筛选器。根据指定的条件对数据进行筛选,并把满足的数据插入虚拟表 VT7

HAVING 语句在 SQL 中的主要作用与 WHERE 语句作用是相同的,但是 HAVING 是过滤聚合值,在 SQL 中增加 HAVING 子句原因就是,WHERE 关键字无法与聚合函数一起使用,HAVING 子句主要和 GROUP BY 子句配合使用。

1.9 SELECT 选出指定列

将虚拟表 VT7 中的在 SELECT 中出现的列筛选出来,并对字段进行处理,计算 SELECT 子句中的表达式,产生虚拟表 VT8

1.10 DISTINCT 行去重

将重复的行从虚拟表 VT8 中移除,产生虚拟表 VT9。DISTINCT 用来删除重复行,只保留唯一的。

1.11 ORDER BY 排列

将虚拟表 VT9 中的行按 ORDER BY 子句中的列/列表排序,生成游标 VC10 ,注意不是虚拟表。因此使用 ORDER BY 子句查询不能应用于表达式。同时,ORDER BY 子句的执行顺序为从左到右排序,是非常消耗资源的。

1.12 LIMIT/OFFSET 指定返回行

VC10 的开始处选择指定数量行,生成虚拟表 VT11,并返回调用者。

2. 笛卡尔积:

两个集合 R 和 S 的笛卡尔积可表示为:R * S;第一个对象是 R 的成员而第二个对象是 S 的所有可能有序对的其中一个成员。

相关文章
|
22天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
120 9
|
15天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
24天前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
|
1月前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
135 3
|
1月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
93 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
89 0
|
15天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
15天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多
下一篇
开通oss服务