MySQL query / clause execution order(MySQL查询/子句执行顺序)
问题描述
在 MySQL 中执行子句的预定义顺序是什么?其中一些是在运行时决定的,这个顺序是否正确?
FROM 子句WHERE 子句GROUP BY 子句HAVING 子句SELECT 子句ORDER BY 子句
MySQL 语句的实际执行有点棘手.但是,该标准确实指定了查询中元素的解释顺序.这基本上是按照您指定的顺序,尽管我认为 HAVING 和 GROUP BY 可以在 SELECT 之后:
FROM子句WHERE子句SELECT子句GROUP BY子句HAVING子句ORDER BY子句
这对于理解查询的解析方式很重要.例如,您不能在 WHERE 子句中使用 SELECT 中定义的列别名,因为 WHERE 在 SELECT 之前被解析代码>.另一方面,这样的别名可以在 ORDER BY 子句中.
至于实际执行,这真的取决于优化器.例如:
<预><代码>...按 a、b、c 分组按空排序和
<预><代码>...按 a、b、c 分组按 a, b, c 排序两者都有 ORDER BY 根本没有被执行的效果——所以在 GROUP BY 之后不会被执行(在第一种情况下,效果是从 GROUP BY 中删除排序,第二个效果是只做 GROUP BY 已经做的事情).
What is the predefined order in which the clauses are executed in MySQL? Is some of it decided at run time, and is this order correct?
FROM clauseWHERE clauseGROUP BY clauseHAVING clauseSELECT clauseORDER BY clause
The actual execution of MySQL statements is a bit tricky. However, the standard does specify the order of interpretation of elements in the query. This is basically in the order that you specify, although I think HAVING and GROUP BY could come after SELECT:
FROMclauseWHEREclauseSELECTclauseGROUP BYclauseHAVINGclauseORDER BYclause
This is important for understanding how queries are parsed. You cannot use a column alias defined in a SELECT in the WHERE clause, for instance, because the WHERE is parsed before the SELECT. On the other hand, such an alias can be in the ORDER BY clause.
As for actual execution, that is really left up to the optimizer. For instance:
. . .
GROUP BY a, b, c
ORDER BY NULL
and
. . .
GROUP BY a, b, c
ORDER BY a, b, c
both have the effect of the ORDER BY not being executed at all -- and so not executed after the GROUP BY (in the first case, the effect is to remove sorting from the GROUP BY and in the second the effect is to do nothing more than the GROUP BY already does).
这篇关于MySQL查询/子句执行顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:MySQL查询/子句执行顺序
基础教程推荐
- SQL Server 实例在登录协商期间返回无效或不受支持的协议版本 2021-01-01
- 无法解决整理冲突 2021-01-01
- 在 SQL 中连接多个表 2021-01-01
- SQL 效率:WHERE IN 子查询 vs. JOIN 然后 GROUP 2021-01-01
- 需要 MySQL 5.1 中的抽象触发器来更新审计日志 2021-01-01
- 将 SQL Server DateTime 列迁移到 DateTimeOffset 2021-01-01
- SSMS 中的权限问题:“对象 'extended_properties'、数据库 'mssqlsystem_resource'、... 错误 229)上的 SELECT 权限被拒绝" 2022-01-01
- 是否可以执行按位分组功能? 2021-01-01
- 如何使用 mysql.connector 禁用查询缓存 2022-01-01
- SQL:使用来自具有相同列名的两个表中的数据... 2021-01-01
