SQL 查询不是从 SELECT 开始的<转>
本文转自:《SQL queries don't start with SELECT》
In a non-image format, the order is:
- FROM/JOIN and all the ON conditions
- WHERE
- GROUP BY
- HAVING
- SELECT (including window functions)
- ORDER BY
- LIMIT
上图是 SQL 查询的语义说明。看懂这张图,便能迅速判断一个给定的 SQL 查询将会返回什么结果,也可以轻松解答如下疑问:
- 可以对 GROUP BY 的结果进行WHERE 筛选吗?(不可以!因为 WHERE 在 GROUP BY 之前执行)
- 可以对窗口函数的执行结果进行过滤吗?(不可以!因为窗口函数在 SELECT 步骤执行,而这步是在 WHERE 和 GROUP BY 之后)
- 可以对 GROUP BY 的结果再执行 ORDER BY 操作吗? (可以!ORDER BY 基本上是最后一个步骤了,所以可以对任何操作的执行结果执行 ORDER BY)
- LIMIT 执行在哪个步骤? (最后一步!)
虽然如此,但实际上数据库引擎并非严格按照这个顺序运行查询,因为它们还会执行一系列的优化,以便提升查询速度。
所以:
-
当你想了解查询语句的有效性,或是想搞明白为什么会返回这样一个查询结果时,可以尝试用该图来解释;
-
但是,使用该图是无法解释查询性能或索引相关问题的,它们会涉及到更多变量,因而也更为复杂。