您现在的位置是:亿华云 > IT科技
我一直以为SQL先执行SELECT语句?一个窗口函数,我突然发现错了
亿华云2025-10-04 04:00:24【IT科技】7人已围观
简介每一个程序猿,在刚拿到一个测试数据库的时候,第一件事,我想无出其右,select * from table,反正我是这样,先看一下数据库大小,直接执行一下,剩下的再说,除了莫名其妙的装X之外,还有一个
每一个程序猿,直为执行在刚拿到一个测试数据库的先现错时候,第一件事,语句我想无出其右,个窗select * from table,口函反正我是数突这样,先看一下数据库大小,直为执行直接执行一下,先现错剩下的语句再说,除了莫名其妙的个窗装X之外,还有一个很大的口函原因就是很多 SQL 查询都是以 SELECT 开始的。不过,数突最近我跟别人解释什么是直为执行窗口函数,我在网上搜索”是先现错否可以对窗口函数返回的结果进行过滤“这个问题,得出的语句结论是”窗口函数必须在 WHERE 和 GROUP BY 之后,所以不能”。
于是我又想到了另一个问题:SQL 查询的执行顺序是怎样的?
好像这个问题应该很好回答,源码库毕竟自己已经写了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说出它的顺序是怎样的。
SQL 查询的执行顺序
于是我研究了一下,发现顺序大概是这样的。SELECT 并不是最先执行的,而是在第五个。

这张图回答了以下这些问题
这张图与 SQL 查询的语义有关,让你知道一个查询会返回什么,并回答了以下这些问题:
可以在 GRROUP BY 之后使用 WHERE 吗?(不行,WHERE 是在 GROUP BY 之前!) 可以对窗口函数返回的结果进行过滤吗?(不行,窗口函数是 SELECT 语句里,而 SELECT 是在 WHERE 和 GROUP BY 之后) 可以基于 GROUP BY 里的东西进行 ORDER BY 吗?(可以,ORDER BY 基本上是在最后执行的云服务器提供商,所以可以基于任何东西进行 ORDER BY) LIMIT 是在什么时候执行?(在最后!)但数据库引擎并不一定严格按照这个顺序执行 SQL 查询,因为为了更快地执行查询,它们会做出一些优化,这些问题会在以后的文章中解释。
所以:
如果你想要知道一个查询语句是否合法,或者想要知道一个查询语句会返回什么,上面的那张图 在涉及查询性能或者与索引有关的东西时,那张图就不适用了。混合因素:列别名
有很多 SQL 实现允许你使用这样的语法:
SELECT CONCAT(first_name, , last_name) AS full_name, count(*) FROM table GROUP BY full_name从这个语句来看,好像 GROUP BY 是在 SELECT 之后执行的,因为它引用了 SELECT 中的一个别名。但实际上不一定要这样,数据库引擎可以把查询重写成这样:
SELECT CONCAT(first_name, , last_name) AS full_name, count(*) FROM table GROUP BY CONCAT(first_name, , last_name)这样 GROUP BY 仍然先执行。
数据库引擎还会做一系列检查,确保 SELECT 和 GROUP BY 中的东西是有效的,所以会在生成执行计划之前对查询做一次整体检查。
数据库可能不按照这个顺序执行查询(优化)
在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的亿华云计算顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。
这个查询说明了为什么需要以不同的顺序执行查询:
SELECT * FROM owners LEFT JOIN cats ON owners.id = cats.owner WHERE cats.name = mr darcy如果只需要找出名字叫“mr darcy”的猫,那就没必要对两张表的所有数据执行左连接,在连接之前先进行过滤,这样查询会快得多,而且对于这个查询来说,先执行过滤并不会改变查询结果。
数据库引擎还会做出其他很多优化,按照不同的顺序执行查询,不过我并不是这方面的专家,所以这里就不多说了。
LINQ 的查询以 FROM 开头
LINQ(C#和 VB.NET 中的查询语法)是按照 FROM…WHERE…SELECT 的顺序来的。这里有一个 LINQ 查询例子:
var teenAgerStudent = from s in studentList where s.Age > 12 && s.Age < 20 select s;pandas 中的查询也基本上是这样的,不过你不一定要按照这个顺序。我通常会像下面这样写 pandas 代码:
df = thing1.join(thing2) # JOIN df = df[df.created_at > 1000] # WHERE df = df.groupby(something, num_yes = (yes, sum)) # GROUP BY df = df[df.num_yes > 2] # HAVING, 对 GROUP BY 结果进行过滤 df = df[[num_yes, something1, something]] # SELECT, 选择要显示的列 df.sort_values(sometthing, ascending=True)[:30] # ORDER BY 和 LIMIT df[:30]这样写并不是因为 pandas 规定了这些规则,而是按照 JOIN/WHERE/GROUP BY/HAVING 这样的顺序来写代码会更有意义些。不过我经常会先写 WHERE 来改进性能,而且我想大多数数据库引擎也会这么做。
有的时候就是这样,我们大众普遍接受的,可能最后发现是错的,就像陈思成的那个电影说的,我们曾经认为根本没有的,后来发现;它确确实实存在。有一些我们深信不疑的,后来却明白;根本就没有。
哈哈哈,还突然文艺了一次,好啦,今天的内容到这里就结束了,也想提一个建议给大家,希望大家在平时工作的时候不要忘记学习,有的时候,我们以为的真不的一定是我们以为的,深入研究一下,编程的魅力才会得到真实的展现
对于数据库的优化,我整理了这样的一张思维导图,有需要的朋友,关注+转发后,私信“资料”查看获取方式吧

很赞哦!(772)
相关文章
- 为什么喜欢国外注册域名?国外注册域名注意什么?
- 旧域名的外链是否会对新建站点产生影响?
- 什么样的邮箱才是安全的电子邮件地址?
- 为什么大家都选优质域名?到底存在着什么好处?
- 在更换域名后,并不是就万事大吉了,我们需要将旧域名做301重定向到新域名上,转移旧域名的权重到新域名上。
- 比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
- 4、企业无形资产:通用网站已成为企业网络知识产权的重要组成部分,属于企业的无形资产,也有助于提升企业的品牌形象和技术领先形象。它是企业品牌资产不可或缺的一部分。
- ④注册门槛低
- 网站页面结构改版,仅是页面样式发生变化,不会对排名、收录有影响;只有涉及到页面URL改变,才会对网站排名、收录有影响。
- 审核通过的域名将显示在域名竞拍页面,并进入正式拍卖期,买家可以在拍卖周期内出价,加价幅度与拍卖保证金说明,点此查看。
热门文章
站长推荐
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
什么样的邮箱才是安全的电子邮件地址?
四、配置网站,填充内容
二、如何选择合适的域名
比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
什么是im域名?新手需要了解im域名哪些?
评估域名涉及的行业规模与发展状况成正比。
4、域名传输时,取决于域名原始用户的邮箱是否有效,以及他是否将密码发送到此邮箱。