MySQL中语句执行顺序
在 MySQL 中,SQL 查询的执行顺序一般按照以下步骤进行。请注意,这里提到的执行顺序可能在某些情况下有所变化,取决于查询的具体结构和优化器的决策。
1. 执行顺序:
-
FROM 子句: 首先,执行 FROM 子句,确定要查询的表和视图。这一步涉及从磁盘加载表的数据或者从内存中获取。
-
JOIN 子句: 如果查询涉及到连接操作 (JOIN),则执行 JOIN 子句,将相关表的数据合并。
-
WHERE 子句: 接下来,执行 WHERE 子句,对行进行过滤。只有满足条件的行会被包含在结果集中。
-
GROUP BY 子句: 如果有 GROUP BY 子句,将结果集按照指定的列分组。
-
HAVING 子句: 如果有 HAVING 子句,对分组后的结果进行条件过滤。
-
SELECT 子句: 执行 SELECT 子句,选择要返回的列或表达式。
-
DISTINCT: 如果查询包含 DISTINCT 关键字,剔除重复的行。
-
ORDER BY 子句: 如果有 ORDER BY 子句,对结果进行排序。
-
LIMIT/OFFSET: 如果有 LIMIT 或 OFFSET 子句,对结果进行限制和偏移。
执行计划优化:
在执行上述步骤时,MySQL 的查询优化器会尝试选择最有效的执 行计划,包括选择索引、决定连接顺序等。
2. AS定义的别名可以使用的情况
在实际应用中,往往会用 AS 定义别名来提高SQL语句的可读性以及使得代码更加简洁,那么知道了MySQL中一条语句的执行情况后,我们也可以更加了解为什么有些情况下定义的别名无法使用
一些常见的情况如下:
- FROM 子句中定义的别名可在任意地方使用——由于FROM是第一个执行的语句
- 在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的扩展可以生效:- 允许在SELECT 子句、HAVING condition和ORDER BY 子句中使用没有出现在GROUP BY 子句中的字段。此时MySQL会随机选择没有出现在GROUP BY 子句中的字段的值。效果和使用ANY_VALUE()是相同的。
- 允许在HAVING condition中使用SELECT 中的ALIAS
总结:
- 总体而言,上述步骤描述了一般的 SQL 查询执行顺序。在实际执行中,MySQL 的优化器会尝试按照最佳的顺序执行查询,以提高性能。
- 查询执行计划可以通过 EXPLAIN 关键字来查看,以了解 MySQL 如何执行给定的查询。