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

新手上路,请多包涵

我正在寻求对此的澄清。我在下面写了两个查询:

我们有一个员工姓名表,其中包含 ID、姓名、工资等列

  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(salary) 不会被计算,因为它需要访问所有列值,然后只有它会返回一个值。

查询 2 作为 substring_index() 作用于单个值,因此在这里它作用于提供给它的值。

您能否验证我的理解。

原文由 Nishant_Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 895
2 个回答

不能在 WHERE 子句中使用 SUM() 的原因是子句的评估顺序。

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

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

想一想: SUM() 仅适用于满足 WHERE 条件的行。如果您将 SUM() 放在 WHERE 子句中,则您要求的是循环逻辑。新行是否通过 WHERE 子句?我怎么会知道?如果它会通过,那么我必须将它包含在 SUM 中,但如果没有,它不应该包含在 SUM 中。那么我该如何评估 SUM 条件呢?

原文由 user5683823 发布,翻译遵循 CC BY-SA 3.0 许可协议

为什么我们不能在 where 子句中使用聚合函数

聚合函数适用于数据集。 WHERE 子句不能访问整个集合,而只能访问它当前正在处理的行。

您当然可以使用 HAVING 子句:

 select name from employee
group by name having sum(salary) > 1000;

如果必须使用 WHERE ,可以使用子查询:

 select name from (
    select name, sum(salary) total_salary from employee
    group by name
) t where total_salary > 1000;

原文由 Gurwinder Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进