【MySQL】MySQL语句执行顺序以及是否可以使用ALIAS定义的别名

本文详细阐述了MySQL中SQL查询的执行顺序,包括FROM、JOIN、WHERE等子句的处理,以及AS定义的别名在不同场景的应用。同时强调了MySQL优化器在执行计划中的作用。
摘要由CSDN通过智能技术生成

MySQL中语句执行顺序

在 MySQL 中,SQL 查询的执行顺序一般按照以下步骤进行。请注意,这里提到的执行顺序可能在某些情况下有所变化,取决于查询的具体结构和优化器的决策。

1. 执行顺序:

  1. FROM 子句: 首先,执行 FROM 子句,确定要查询的表和视图。这一步涉及从磁盘加载表的数据或者从内存中获取。

  2. JOIN 子句: 如果查询涉及到连接操作 (JOIN),则执行 JOIN 子句,将相关表的数据合并。

  3. WHERE 子句: 接下来,执行 WHERE 子句,对行进行过滤。只有满足条件的行会被包含在结果集中。

  4. GROUP BY 子句: 如果有 GROUP BY 子句,将结果集按照指定的列分组。

  5. HAVING 子句: 如果有 HAVING 子句,对分组后的结果进行条件过滤。

  6. SELECT 子句: 执行 SELECT 子句,选择要返回的列或表达式。

  7. DISTINCT: 如果查询包含 DISTINCT 关键字,剔除重复的行。

  8. ORDER BY 子句: 如果有 ORDER BY 子句,对结果进行排序。

  9. LIMIT/OFFSET: 如果有 LIMIT 或 OFFSET 子句,对结果进行限制和偏移。

执行计划优化
在执行上述步骤时,MySQL 的查询优化器会尝试选择最有效的执 行计划,包括选择索引、决定连接顺序等。

2. AS定义的别名可以使用的情况

在实际应用中,往往会用 AS 定义别名来提高SQL语句的可读性以及使得代码更加简洁,那么知道了MySQL中一条语句的执行情况后,我们也可以更加了解为什么有些情况下定义的别名无法使用

一些常见的情况如下:

  1. FROM 子句中定义的别名可在任意地方使用——由于FROM是第一个执行的语句
  2. 在SELECT中定义的别名可在ORDER BY 中使用,但是无法在WHERE语句中使用,正常情况下也无法在GROUP BY语句中使用,但是:

    MySQL对此作了扩展。在MySQL 5.7.5之前的版本, ONLY_FULL_GROUP_BY SQL mode默认不开启。在5.7.5或之后的版本默认开启。
    如果ONLY_FULL_GROUP_BY SQL mode不开启,那么MySQL对标准SQL的扩展可以生效:

    1. 允许在SELECT 子句、HAVING condition和ORDER BY 子句中使用没有出现在GROUP BY 子句中的字段。此时MySQL会随机选择没有出现在GROUP BY 子句中的字段的值。效果和使用ANY_VALUE()是相同的。
    2. 允许在HAVING condition中使用SELECT 中的ALIAS

总结:

  1. 总体而言,上述步骤描述了一般的 SQL 查询执行顺序。在实际执行中,MySQL 的优化器会尝试按照最佳的顺序执行查询,以提高性能。
  2. 查询执行计划可以通过 EXPLAIN 关键字来查看,以了解 MySQL 如何执行给定的查询。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值