我正在寻求对此的澄清。我在下面写了两个查询:
我们有一个员工姓名表,其中包含 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 许可协议
不能在
WHERE
子句中使用SUM()
的原因是子句的评估顺序。FROM
告诉你从哪里读取行。在将行从磁盘读取到内存时,会检查它们是否符合WHERE
条件。 (实际上,在许多情况下,WHERE
子句失败的行甚至不会从磁盘读取。“条件”正式称为 _谓词_,一些谓词被查询执行引擎使用来决定哪些行是从基表中读取。这些称为 访问 谓词。)如您所见,WHERE
子句在呈现给引擎时应用于每一行。另一方面,只有在读取了所有行(验证所有谓词)之后才进行聚合。
想一想:
SUM()
仅适用于满足WHERE
条件的行。如果您将SUM()
放在WHERE
子句中,则您要求的是循环逻辑。新行是否通过WHERE
子句?我怎么会知道?如果它会通过,那么我必须将它包含在SUM
中,但如果没有,它不应该包含在SUM
中。那么我该如何评估SUM
条件呢?