sql中where语句可以用select吗:SQL查询是从Select开始的吗
sql中where语句可以用select吗:SQL查询是从Select开始的吗这就是我查找到的顺序!(SELECT并不是在第一步执行,而是到第五步才执行)SQL查询按此顺序进行但是!昨天我正在做窗口函数的解释说明,并且我发现自己在谷歌上搜索“你能根据窗口函数的结果进行过滤吗”。比如 — 你能在WHERE、HAVING或者其它地方过滤窗口函数的结果吗?最后我得出的结论是:“窗口函数必须在WHERE和GROUP BY之后运行,所以你做不到”。但这让我想到了一个更大的问题 — SQL查询的实际运行顺序是什么?这是我凭直觉就知道的事情(“我肯定知道!我已经编写了至少10000个SQL查询,其中一些非常复杂!),但我很难真正地准确说出顺序是什么。
作者 | Julia Evans
译者 | 王雪迎 责编 | 孙胜
出品 | CSDN(ID:CSDNnews)
好吧,显然很多SQL查询都是从SELECT开始的(实际上本文只是关注SELECT查询,而不是INSERT或其它别的什么)。
但是!昨天我正在做窗口函数的解释说明,并且我发现自己在谷歌上搜索“你能根据窗口函数的结果进行过滤吗”。比如 — 你能在WHERE、HAVING或者其它地方过滤窗口函数的结果吗?
最后我得出的结论是:“窗口函数必须在WHERE和GROUP BY之后运行,所以你做不到”。但这让我想到了一个更大的问题 — SQL查询的实际运行顺序是什么?
这是我凭直觉就知道的事情(“我肯定知道!我已经编写了至少10000个SQL查询,其中一些非常复杂!),但我很难真正地准确说出顺序是什么。
SQL查询按此顺序进行
这就是我查找到的顺序!(SELECT并不是在第一步执行,而是到第五步才执行)
(这里是一篇推特: https://Twitter.com/b0rk/status/1179449535938076673)
(我真的很想找到一种比“sql查询按此顺序发生/运行”更准确的表达方式,但我还没想出来。)
在非图形格式中,其顺序为:
l FROM/JOIN 和所有的 ON 条件
l WHERE
l GROUP BY
l HAVING
l SELECT(包括窗口函数)
l ORDER BY
l LIMIT
图解此图有助于你做出回答
此图是关于SQL查询的语义的 — 你可以通过它,对给定查询将返回什么结果进行推理,并回答如下问题:
我能在一个GROUP BY的结果上执行WHERE么?(不行!WHERE发生在GROUP BY之前!)
我可以根据窗口函数的结果进行过滤吗(不行!窗口函数发生在SELECT中,它发生在WHERE和GROUP BY之后)
我可以基于GROUP BY中所做的来进行ORDER BY么?(可以!ORDER BY是最后执行的基本步骤,你可以根据任何东西做ORDER BY!)
LIMIT何时执行?(在最后!)
数据库引擎实际并不是按这个顺序运行查询
因为它实现了一系列优化以使查询运行得更快 — 我们稍后将在本文中讨论这一点。
所以:
-
当你只想了解哪些查询是有效的,以及如何推理给定查询的结果时,可以使用此图。
-
你不应该使用此图来解释查询性能或任何有关索引的事情,那是一个复杂得多的问题,涉及更多变量。