发布网友 发布时间:2022-04-11 04:12
共2个回答
懂视网 时间:2022-04-11 08:33
于是我研究了一下,发现在SQL语句的执行顺序中,SELECT并不是最先执行的,而是在第五个。
上面这张图与SQL查询语句的语义有关,能让你知道一个查询会返回什么,并回答了以下这些问题:
1.可以在GROUP BY之后使用WHERE吗?(不行,WHERE是在GROUP BY之前!)
2.可以对窗口函数返回的结果进行过滤吗?(不行,窗口函数是SELECT语句里,而SELECT是在WHERE和GROUP BY之后)
3.可以基于GROUP BY里的东西进行ORDER BY吗?(可以,ORDER BY基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY)
4.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 = ‘tommy‘
如果只需要找出名字叫tommy的猫,那就没必要对两张表的所有数据执行左连接,而是应该在连接之前先进行过滤,这样查询会快得多。而且对于这个查询来说,先执行过滤并不会改变查询结果。因此在这里数据库引擎会根据执行效率最优对执行顺序进行优化,生成相对应的执行计划方案。
"不要眼眶一红,就觉得人间不值得。"
sql查询语句并不是最先执行SELECT
标签:src rom 关键字 span tom ast 而且 执行sql 解释
热心网友 时间:2022-04-11 05:41
在执行where时,出现的字段或别名,会试图在select 后的列表中查询(如果是*,则会查询所有字段)查询不代表开始执行select了。