Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在sql中何时执行聚合函数(如sum()、max()…等)_Mysql_Sql_Sql Server_Group By_Aggregate Functions - Fatal编程技术网

Mysql 在sql中何时执行聚合函数(如sum()、max()…等)

Mysql 在sql中何时执行聚合函数(如sum()、max()…等),mysql,sql,sql-server,group-by,aggregate-functions,Mysql,Sql,Sql Server,Group By,Aggregate Functions,根据我的知识,GROUPBY子句在select语句之前执行 所以,如果我们在select语句中有一个sum()函数,那么这个函数什么时候才能执行 对于下面查询中的eg select c1,sum(c2) from table group by c1; 分组时是否执行sum(c2)?如果是,那么它如何知道必须执行sum()而不是其他任何操作,因为group by发生在select子句之前。还是别的什么 谢谢大家! 根据我的知识,GROUPBY子句在select语句之前执行 这是不正确的。SQL语

根据我的知识,GROUPBY子句在select语句之前执行

所以,如果我们在select语句中有一个sum()函数,那么这个函数什么时候才能执行

对于下面查询中的eg

select c1,sum(c2)
from table
group by c1;
分组时是否执行sum(c2)?如果是,那么它如何知道必须执行sum()而不是其他任何操作,因为group by发生在select子句之前。还是别的什么

谢谢大家!

根据我的知识,GROUPBY子句在select语句之前执行

这是不正确的。SQL语句中唯一隐含的“顺序”是查询解释的逻辑顺序。这指定首先根据
FROM
子句解释标识符,然后根据
WHERE
子句解释标识符,依此类推

SELECT
语句描述了结果集。SQL引擎可以自由地以它认为合适的任何方式生成结果集。这通常包括两个阶段,编译阶段和优化阶段。标识符的解释处于编译阶段


实际执行的通常是操作的有向无环图(DAG)。查询被编译到此结构中。大多数数据库支持一种查看实际执行内容的方法,通常是通过
explain
方法。DAG可以重新安排操作,甚至可以消除一些操作(如果不需要)。

因此,当执行group by子句时,是否检查select语句以查看要为group执行的聚合函数(在我们的例子中是sum())。天真的实现可以在不知道将应用哪些聚合的情况下进行分组,只要它在该阶段有某种方法在一列中存储多个值。因此,它可以有“对于组
a,1
,我在
c
列中有值
(4,5,9)
,在
D
列中有值
('D','J','K')
”。这需要一些类似于内部数组的数据类型。不是说任何实现都能做到这一点,而是说分组与聚合是如何分开进行的。但这似乎效率很低?@AADITHYAKRISHNAN-重点是要证明,您可以轻松构建一个系统,其中分组和计算聚合是分开的活动。因为你的问题似乎是基于一个假设,即你必须同时做这两件事。至于效率,我不能说。在某些情况下,这很容易成为一种可行的策略,这又回到了SQL的思想,在SQL中,您告诉系统您想要什么,而不是如何做。希望优化器在大多数情况下都会选择一个不合理的策略。谢谢,在SQLServerManagementStudio 2008中也有检查执行顺序的工具r2@AADITHYAKRISHNAN . . . 您需要查看执行计划,您可以通过SSMS执行。