很多 SQL 查询都是询语先执行以 SELECT 开始的。不过,句总最近我跟别人解释什么是都错窗口函数,我在网上搜索”是询语先执行否可以对窗口函数返回的结果进行过滤“这个问题,得出的句总结论是”窗口函数必须在 WHERE 和 GROUP BY 之后,所以不能”。都错于是询语先执行我又想到了另一个问题:SQL 查询的执行顺序是怎样的? 好像这个问题应该很好回答,毕竟自己已经写了上万个 SQL 查询了,句总有一些还很复杂。都错但事实是询语先执行,我仍然很难确切地说出它的句总顺序是怎样的。 SQL 查询的都错执行顺序 于是我研究了一下,发现顺序大概是询语先执行这样的。SELECT 并不是句总最先执行的站群服务器,而是都错在第五个。 这张图回答了以下这些问题 这张图与 SQL 查询的语义有关,让你知道一个查询会返回什么,并回答了以下这些问题: 但数据库引擎并不一定严格按照这个顺序执行 SQL 查询,因为为了更快地执行查询,它们会做出一些优化,这些问题会在以后的文章中解释。 所以: 混合因素:列别名 有很多 SQL 实现允许你使用这样的语法: 从这个语句来看,好像 GROUP BY 是亿华云在 SELECT 之后执行的,因为它引用了 SELECT 中的一个别名。但实际上不一定要这样,数据库引擎可以把查询重写成这样: 这样 GROUP BY 仍然先执行。 数据库引擎还会做一系列检查,确保 SELECT 和 GROUP BY 中的东西是有效的,所以会在生成执行计划之前对查询做一次整体检查。 数据库可能不按此顺序执行查询(优化) 在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。 这个查询说明了为什么需要以不同的顺序执行查询: 如果只需要找出名字叫“mr darcy”的猫,那就没必要对两张表的所有数据执行左连接,在连接之前先进行过滤,这样查询会快得多,而且对于这个查询来说,先执行过滤并不会改变查询结果。 数据库引擎还会做出其他很多优化,按照不同的顺序执行查询,源码下载不过我并不是这方面的专家,所以这里就不多说了。 LINQ 的查询以 FROM 开头 LINQ(C# 和 VB.NET 中的查询语法)是按照 FROM...WHERE...SELECT 的顺序来的。这里有一个 LINQ 查询例子: pandas 中的查询也基本上是这样的,不过你不一定要按照这个顺序。我通常会像下面这样写 pandas 代码: 这样写并不是因为 pandas 规定了这些规则,而是按照 JOIN/WHERE/GROUP BY/HAVING 这样的顺序来写代码会更有意义些。不过我经常会先写 WHERE 来改进性能,而且我想大多数数据库引擎也会这么做。 R 语言里的 dplyr 也允许开发人员使用不同的语法编写 SQL 查询语句,用来查询 Postgre、MySQL 和 SQLite。