Mysql——语句执行顺序

本文详细解析了MySQL查询语句的执行过程,共分为11个步骤,从FROM操作开始直至LIMIT操作结束。通过逐步分析,揭示了每一步骤如何处理数据并最终形成查询结果。

MySQL的语句执行顺序

MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作。其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回。如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。

下面我们来具体分析一下查询处理的每一个阶段

  1. FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
  2. ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。 on后面可以跟多个条件,加括号例如:SELECT A.TNAME FROM TEACHER A JOIN (COURSE B, SCORE C) ON (A.TNO=B.TNO AND B.CNO=C.CNO) GROUP BY C.CNO HAVING COUNT(C.CNO)>5;
  3. JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。join后同样可以加多个表,如:SELECT A.TNAME FROM TEACHER A JOIN (COURSE B, SCORE C) ON (A.TNO=B.TNO AND B.CNO=C.CNO) GROUP BY C.CNO HAVING COUNT(C.CNO)>5;
  4. WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。
  5. GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.
  6. CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
  7. HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。
  8. SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。
  9. DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
  10. ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.
  11. LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。

 

SELECT s.sid,AVG(score)a FROM student s INNER JOIN sc c ON s.sid=c.sid GROUP BY c.sid HAVING a>70;

select只是显示,函数的执行是在group之后执行

转载于:https://www.cnblogs.com/wy20110919/p/8721828.html

### MySQL 中 JSON 操作的执行顺序MySQL 5.7 及以上版本中,对于 JSON 数据的操作遵循特定的执行顺序。这些操作通常涉及创建、修改以及检索 JSON 文档中的数据。 #### 创建和插入 JSON 数据 当向表中插入包含 JSON 字段的新记录时,MySQL 首先会验证所提供的字符串是否符合合法的 JSON 格式[^1]。如果输入有效,则将其作为 JSON 对象存储;反之则抛出错误拒绝该条目。 #### 更新现有 JSON 数据 更新已存在的 JSON 列内的值同样需要经过合法性检查过程。一旦确认无误之后,可以利用函数如 `JSON_SET()`, `JSON_REPLACE()` 或者 `JSON_MERGE_PATCH()` 来实现对指定路径下的键值对进行增删改等动作[^2]。 #### 查询 JSON 数据 为了高效地访问嵌套结构内部的信息,在构建 WHERE 子句条件表达式或者 SELECT 投影列表项的时候,应该采用专门设计用于处理此类情况的方法: - 使用 `->` 运算符来获取某个属性的具体内容; - 应用 `JSON_CONTAINS()` 和其他谓词测试是否存在某些元素; - 调用聚合函数比如 `MAX()`, `MIN()` 结合 `JSON_EXTRACT()` 提取数值并计算统计量。 值得注意的是,上述提到的各种功能调用均按照 SQL 语句本身的语法逻辑依次被执行——即从左至右逐个解析各个组成部分直至完成整个请求流程[^3]。 例如下面这段代码展示了如何通过多个步骤组合起来达到复杂查询目的: ```sql SELECT id, name, (data ->> '$.age') AS age -- 获取年龄字段 FROM users; ``` 此命令首先选取了所有列名为id,name的数据行,接着再从中提取json对象"data"里的"age"成员赋给新别名"age"[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值