当前位置: 首页 > 知识库问答 >
问题:

where子句中为什么不允许聚合函数

卢勇
2023-03-14

我们有一个员工姓名表,其中列有ID、name、salary

  1.  Select name from employee 
    where sum(salary) > 1000 ;

  2.  Select name from employee 
    where substring_index(name,' ',1) = 'nishant' ;

查询1不起作用,但查询2起作用。从我的开发经验来看,我觉得对此可能的解释是:

sum()处理参数中指定的一组值。这里传递了'salary'列,因此它必须将此列的所有值相加。但是在where子句中,记录是一个接一个地检查的,就像第一条记录1是为了测试而检查的,等等。因此,不会计算sum(工资),因为它需要访问所有列的值,然后只有它返回一个值。

你能验证一下我的理解吗。

共有1个答案

牟辰龙
2023-03-14

不能在where子句中使用sum()的原因是子句的求值顺序。

from告诉您从哪里读取行。当行从磁盘读到内存时,会检查它们是否符合where条件。(实际上,在许多情况下,WHERE子句失败的行甚至不会从磁盘中读取。“条件”在形式上称为谓词,查询执行引擎使用一些谓词来决定从基表读取哪些行。这些被称为访问谓词。)如您所见,WHERE子句应用于向引擎显示的每一行。

另一方面,只有在读取了所有行(验证所有谓词)之后才会进行聚合。

考虑一下:sum()仅适用于满足where条件的行。如果将sum()放在where子句中,则要求循环逻辑。新行是否传递WHERE子句?我怎么知道?如果通过,则必须将其包含在sum中,但如果不通过,则不应将其包含在sum中。那么如何计算sum条件呢?

 类似资料:
  • 问题内容: 简而言之,我有一个表格,其中除其他外,还包含一个用于时间戳记的列。我想获得具有最新(即最大价值)时间戳的行。目前,我正在这样做: 但是我宁愿做这样的事情: 但是,SQLite拒绝此查询: 该文件证实了这一行为(页面底部): 聚合函数只能在SELECT语句中使用。 我的问题是:是否可以编写查询以获取具有最大时间戳的行,而无需对select进行排序并将返回的行数限制为1?这似乎应该有可能,

  • 问题内容: 此sql代码抛出一个 WHERE中不允许使用聚合函数 如何避免此错误? 问题答案: 用替换子句,如下所示: 与相似,两者均用于过滤结果记录,但用于过滤汇总数据(使用时)。

  • 我为Select创建了动态DB2存储过程。我将使用这个泛型查询通过传递参数来执行多个select语句。 下面是我的查询的样子。 当我运行这个的时候

  • 问题内容: 我(彻底)目前正在学习SQL,并遇到了该子句。 根据您提供的参数对结果集进行汇总或分组。如果在查询中使用此子句,则可以在结果集上执行聚合函数以查找结果集的统计信息,例如查找平均值或频率。 我的问题是:没有随附的聚合函数,GROUP BY语句是否有任何用处? 更新 使用的同义词是(可能)是一个坏主意,因为我怀疑它是慢。 问题答案: 没有随附的汇总功能,GROUP BY语句有什么用吗? 在

  • 问题内容: 我刚接触PHP,但是多年来我一直在使用类似的语言进行编程。我被以下内容弄糊涂了: 它产生了语法错误:这就是调用。 但这很好用: 碰了一会儿之后,我被告知您不能在默认属性中调用函数。你必须在做。我的问题是:为什么?这是“功能”还是草率的实现?有什么根据? 问题答案: 编译器代码建议这是设计使然,尽管我不知道其背后的官方原因是什么。我也不确定要可靠地实现此功能需要花费多少精力,但是目前完成

  • 问题内容: 我读了这个问题,并认为如果可以写的话,很容易解决(不是没有它就不能解决): 我不确定在很多情况下它是否有用,但是我想知道为什么它没有用,以及其他语言中是否存在类似的东西。 你们有什么感想? 编辑: 澄清一下:是的,我知道,这在Java中是不可能的,我也不是很想念它。这不是我期望的工作,并且惊讶于出现编译器错误。我只是有这个主意,喜欢讨论它。 问题答案: 它违反了封装。你不应该能够绕过父