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

标签 sql oracle aggregate-functions

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

我们有一张员工姓名表,其中包含 ID、姓名、薪水

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

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

查询 1 不起作用,但查询 2 起作用。根据我的开发经验,我觉得可能的解释是:

The sum() works on a set of values specified in the argument. Here 'salary' column is passed , so it must add up all the values of this column. But inside where clause, the records are checked one by one , like first record 1 is checked for the test and so on. Thus sum(salary) will not be computed as it needs access to all the column values and then only it will return a value.



查询 2 的工作方式是 substring_index() 处理单个值,因此这里它处理提供给它的值。

你能验证我的理解吗?

最佳答案

不能使用的原因SUM()WHERE子句是子句的求值顺序。
FROM告诉您从何处读取行。当行从磁盘读取到内存时,检查 WHERE状况。 (实际上,在许多情况下,未通过 WHERE 子句的行甚至不会从磁盘读取。“条件”正式称为谓词,并且某些谓词 - 由查询执行引擎使用 - 来决定从基数读取哪些行表。这些被称为访问谓词。)如您所见,WHERE子句应用于呈现给引擎的每一行。

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

想一想:SUM()仅适用于满足 WHERE 的行状况。如果你把 SUM()WHERE条款,你要求循环逻辑。新行是否通过 WHERE条款?我怎么会知道?如果它通过,那么我必须将它包含在 SUM 中,但如果不是,则不应包含在 SUM 中.那么我如何评估 SUM健康)状况?

关于sql - 为什么 where 子句中不允许使用聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42470849/

相关文章:

sql - 当我阅读其他关于此的帖子时,我仍然看不出 GROUP BY 和 ORDER BY 在 SQL 中的区别。它是什么?

mysql - SQL JOIN从表flights对应的表格表2中返回记录

oracle - ORA-01013 - Weblogic 设置错误?

MySQL - 在 CSV 列中搜索 CSV

sql - 在 Oracle 中,如何将 Rank() (或任何其他工作方式)降低到组级别而不是行级别?

sql - 在不违反主键和唯一约束的情况下更改表结构

sql - 如何将字段内的值总和分配给变量?

mysql - 将聚合、外连接查询转换为 ANSI-92

java - javax.sql 和 java.sql 之间的区别?

mysql - 通过和失败记录相同的测试