【发布时间】:2017-07-17 04:28:58
【问题描述】:
我正在寻求对此的澄清。我在下面写了两个查询:
我们有一个员工姓名表,其中包含 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() 作用于单个值,因此在这里它作用于提供给它的值。
您能否验证我的理解。
【问题讨论】:
-
您认为查询 1 可以实现什么目标?你认为它做什么/应该做什么(用英语)?所以你想要每个“工资总和”高于 1000 的员工的姓名?但是每个员工只有一份工资,那么“工资总和”是什么意思呢?
-
@ErwinBolwidt 如果代替 sum(),我使用的是 avg(),假设我想要薪水高于 avg() 的员工。我只想验证我为什么不能在 where 子句中使用聚合函数的解释。
-
@user3527008 - 您可以在
having子句中使用它们 -
@AlexPoole - 我读到这个问题的意思是,“为什么 SQL 的设计者需要限制聚合函数的使用,所以它们只能在
HAVING子句中而不是 @987654324 @?他们不能出现在WHERE子句中是否有合理的原因?" -
当然,一个更好的问题是“为什么不能有一个像
where sal = max(sal)或where sal > avg(sal)这样的where子句(即使没有group by子句 - 将所有行放在一个组)。正如我解释的那样,原因是这需要循环推理,因为max和avg并未应用于基表中的所有行;它们仅应用于满足 @987654332 的行@ 条件!如果整个基表需要max或avg,则必须在子查询中单独计算。
标签: sql oracle aggregate-functions