mysql语句执行顺序

MySQL语句的大致执行顺序如下:

  1. FROM:指定要查询的表。
  2. JOIN:根据指定的条件,将两个或多个表合并为一个结果集。
  3. WHERE:对查询结果进行筛选,只保留满足指定条件的行。
  4. GROUP BY:将结果集按照指定的列进行分组。
  5. WITH ROLLUP:按照GROUP BY的列对结果集进行汇总,并添加一行用于总计或小计。
  6. HAVING:对分组后的结果进行筛选,只保留满足指定条件的分组。
  7. SELECT:选择要查询的列。
  8. DISTINCT:对查询结果进行去重。
  9. UNION:将两个或多个查询结果集合并为一个结果集。
  10. ORDER BY:按照指定的列对结果集进行排序。
  11. LIMIT:指定查询结果的行数限制。

需要注意的是,并非所有的SQL查询都会按照以上顺序执行,这取决于具体的查询语句,例如使用子查询时,子查询会优先执行,然后再执行主查询。

MySQL 语句存在逻辑执行顺序和物理执行顺序。逻辑执行顺序是一个概念模型,用于理解 SQL 的行为和规则;而物理执行顺序方面,MySQL 的查询优化器为提高效率可能会对其进行改变,例如将 WHERE 条件下推到存储引擎层以便在读取数据时就进行过滤,还可能根据统计信息和索引决定 JOIN 的顺序 [^1]。 标准查询语句的逻辑执行顺序如下: 1. 执行 `FROM`、`JOIN` 确定表之间的连接关系,得到初步的数据 [^2]。 2. 使用 `WHERE` 对数据进行普通的初步筛选 [^2]。 3. 通过 `GROUP BY` 进行分组,各组分别执行 `HAVING` 中的普通筛选或者聚合函数筛选 [^2]。 4. 执行 `SELECT`,可以是普通字段查询也可以是获取聚合函数的查询结果,若为集合函数,`SELECT` 的查询结果会新增一条字段 [^2]。 5. 对查询结果进行去重操作 `DISTINCT` [^2]。 6. 合并各组的查询结果,按照 `ORDER BY` 的条件进行排序 [^2]。 以一个具体的 SQL 语句为例: ```sql SELECT DISTINCT user.name FROM user JOIN vip ON user.id = vip.id WHERE user.id > 10 GROUP BY user.mobile HAVING COUNT(*) > 2 ORDER BY user.id LIMIT 3; ``` 其执行顺序为: 1. `FROM user JOIN vip ON user.id = vip.id`:确定 `user` 表和 `vip` 表的连接关系 [^4]。 2. `WHERE user.id > 10`:对连接后的数据进行初步筛选,筛选出 `user.id` 大于 10 的数据 [^4]。 3. `GROUP BY user.mobile`:根据 `user.mobile` 进行分组 [^4]。 4. `HAVING COUNT(*) > 2`:在分组后的数据中,使用聚合函数 `COUNT(*)` 统计每组的数量,并筛选出数量大于 2 的分组 [^4]。 5. `SELECT user.name`:从分组聚合完的表中挑选出需要查询的字段 `user.name` [^4]。 6. `DISTINCT`:对查询出来的数据进行去重操作 [^4]。 7. `ORDER BY user.id`:对去重后的数据按照 `user.id` 进行排序 [^4]。 8. `LIMIT 3`:对排序后的数据选出前面 3 条 [^4]。 在执行器层面,若表有相应权限,会打开表继续执行。若表的 `ID` 字段没有索引,执行器会调用 InnoDB 引擎接口取表的第一行,判断 `ID` 值是否符合条件,符合则存入结果集,不符合则跳过,然后调用引擎接口取“下一行”,重复判断逻辑,直到取到表的最后一行,最后将满足条件的行组成的记录集作为结果集返回给客户端。对于有索引的表,执行逻辑类似,第一次调用“取满足条件的第一行”接口,之后循环取“满足条件的下一行”接口。数据库慢查询日志中的 `rows_examined` 字段表示语句执行过程中扫描的行数,该值在执行器每次调用引擎获取数据行时累加,但引擎扫描行数跟 `rows_examined` 并非完全相同 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值