空查询中的ALL运算符与Any运算符对比

8
我正在阅读有关 ANY 和 ALL 运算符的 Oracle 文档。我基本理解它们的用途,除了一个问题。文档中说:
ALL :
如果子查询返回零行,则条件评估为 TRUE。
ANY :
如果子查询返回零行,则条件评估为 FALSE。
这对我来说似乎不太合理。为什么对于空子查询,ALL 的结果会是 TRUE,而 ANY 的结果会是 FALSE 呢?
由于我在 SQL 方面相对较新,所以我认为这种行为一定有其使用场景,但对我来说确实很难理解。
那么,对于一个空集合,ANY 和 ALL 应该返回相同的值,不是吗?
2个回答

13

考虑该链接中EMP表的示例。

具体来说,是这个查询语句 -

SELECT e1.empno, e1.sal
FROM   emp e1
WHERE  e1.sal > ANY (SELECT e2.sal
                     FROM   emp e2
                     WHERE  e2.deptno = 20);

在任何情况下,你所问的问题是“我的工资是否比第20个部门中的任何人都要高(至少有1个人)”。这意味着你希望至少有一个人的工资低于你的工资。当没有行时,它返回FALSE,因为没有人的工资低于你的工资,而你希望至少有一个人的工资低于你。

在所有情况下,你将会问的明显问题是“我的工资是否比所有人都要高?”。重新表述为“是否没有人的工资比我高?”当没有返回行时,你的答案是TRUE,因为“确实没有人的工资比我高。”


应该是最佳答案 - laura

8
因为ANY被解释为EXIST(如果有任何一个,就表示它们存在)。因此,如果没有找到任何行,则返回false。 All并不保证存在任何值,它只是保证代表所有可能的值。因此,即使没有找到任何行,它也返回true。

2
值得一提的是一个例子:如果你有一个检查要做,例如empSalary > ALL (select salary from someTable),如果在select salary from someTable中没有行,则它会评估为真,因为您正在检查的值比所有值都要大(即使它们不存在) :) - Jorge Campos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接