编程猫课程等级,编程猫课程表

显然,许多SQL查询都是以SELECT开始的(实际上,本文只关注SELECT查询,而不是INSERT或其他任何查询)。

  但是!昨天在讲解窗口函数,发现自己在Google上搜索“能不能根据窗口函数的结果过滤”。比如可以在WHERE,HAVING或者其他地方过滤窗口函数的结果吗?

  最后得出结论:“窗口函数必须运行在WHERE和GROUP BY之后,所以你做不到”。但是这给我带来了一个更大的问题SQL查询的实际运行顺序是什么?

  这是我凭直觉知道的(“我肯定知道!我至少写过10000个SQL查询,有些非常复杂!),但是我真的很难说出到底是什么顺序。

  编程猫课程等级,编程猫课程表

  SQL查询按此顺序进行

  

  这是我找到的顺序!(SELECT不在第一步中执行,仅在第五步中执行)

  (以下是推文:https://twitter.com/b0rk/status/1179449535938076673)

  (我很想找一个比“sql查询按照这个顺序发生/运行”更准确的表述,但是我还没想出来。)

  编程猫课程等级,编程猫课程表

  在非图形格式中,顺序是:

  编程猫课程等级,编程猫课程表

  图解此图有助于你做出回答

  

  此图是关于SQL查询的语义,您可以推断给定的查询将返回什么结果,并回答以下问题:

  我可以对GROUP BY的结果执行WHERE吗?(不!分组前发生在哪里!)

  我可以根据窗口函数的结果过滤吗(不!该窗口出现在SELECT中,后者出现在WHERE和GROUP BY之后。

  我可以根据分组方式来排序吗?(是的!ORDER BY是最后执行的基本步骤。你可以根据任何东西来点菜!)

  何时执行限制?(最后!)

  编程猫课程等级,编程猫课程表

  数据库引擎实际并不是按这个顺序运行查询

  

  因为它实现了一系列优化来使查询运行得更快——我们将在本文后面讨论这一点。

  所以:

  当您只想知道哪些查询是有效的,以及如何推理给定查询的结果时,可以使用此图。

  您不应该使用这个图表来解释查询性能或任何与索引相关的东西。这是一个涉及更多变量的复杂得多的问题。

  编程猫课程等级,编程猫课程表

  混淆因素:列别名

  

  有人在Twitter上指出,许多SQL实现允许使用以下语法:

  该查询使GROUP BY看起来像是在SELECT之后发生的,即使GROUP BY是先执行的,因为GROUP BY引用SELECT中的别名。然而,要使GROUP BY工作,它并不真的需要在SELECT之后运行——数据库引擎只需要将查询重写为:

  先按组运行。

  在开始运行查询之前,您的数据库引擎肯定会执行一系列检查,以确保您在SELECT和GROUP BY中输入的内容在一起是有意义的。因此,在开始制定执行计划之前,它必须将查询视为一个整体。

  编程猫课程等级,编程猫课程表

  查询实际上不是按此顺序运行的(优化!)

  

  实际上,数据库引擎并不是真的通过连接,然后过滤,然后分组来运行查询,因为它们实现了一系列的优化。只要在不改变查询结果的情况下重新安排执行顺序,就可以重新安排执行顺序以使查询运行得更快。

  一个简单的例子说明了为什么您需要以不同的顺序运行查询以使它们更快。

  

速运行,在这个查询中:

如果你只需要查找3个名为“mr darcy”的猫,那么执行整个左连接并匹配这两个表中的所有行是非常愚蠢的 ―― 首先对名为“mr darcy”的猫进行一些筛选要快得多。在这种情况下,先进行过滤不会改变查询结果!

实际上,数据库引擎还实现了许多其它优化,这些优化可能会使它们以不同的顺序运行查询,但不能再说了,老实讲,这方面我不是专家。

编程猫课程等级,编程猫课程表

LINQ以FROM开始查询

LINQ(一种C#和VB.NET中的查询语法)使用的顺序为FROM … WHERE … SELECT。下面是一个LINQ查询的示例:

pandas(我所喜欢的数据治理工具:https://github.com/jvns/pandas-cookbook)也基本上是这样工作的,尽管你不需要使用这种精确的顺序 ― 我经常会这样编写pandas代码:

这并不是因为pandas对如何编写代码强加了任何特定规则。只是按照JOIN / WHERE / GROUP BY / HAVING的顺序编写代码通常好理解。(不过,我经常会先放一个WHERE来提高性能,而且我认为大多数数据库引擎实际也会先执行WHERE)

在R的dplyr中,你还能使用不同的语法来查询诸如Postgres、MySQL或SQLite等SQL数据库,它们的顺序也更符合逻辑。

不知道这一点令我自己着实惊讶

我写了这样一篇博文,因为当我发现这个顺序的时候非常惊讶,我以前从来没有看到过它被这样写下来 ― 它基本上解释了我凭直觉所知道的,关于为什么一些查询被允许而另一些不被允许的一切。所以我想把它写下来,希望它能帮助其他人理解如何编写SQL查询。

编程猫课程等级,编程猫课程表

<

来源于互联网,信息真实性请自行核查,如果侵犯您的权益,请发送邮件至3484479098@qq.com反馈,本站将在三个工作日之内删除。
(0)
激情体育的头像激情体育注册用户
上一篇 2023年 5月 30日 上午9:46
下一篇 2023年 5月 30日 上午9:56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

zh_CNChinese