你确定 SQL 查询都是以 SELECT 开始的?
许多 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”的猫,那就没须要对两张表的全部数据执行左毗连,在毗连之前先举办过滤,这样查询会快得多,并且对付这个查询来说,先执行过滤并不会改变查询功效。 数据库引擎还会做出其他许多优化,凭证差异的次序执行查询,不外我并不是这方面的专家,以是这里就不多说了。保举:MySQL全面优化,速率飞起来。 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。
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |