ALL运算符VS Any对空查询

时间:2015-03-09 15:46:47

标签: sql oracle

我正在阅读ANY和ALL运算符上的oracle documentation。除了一件事,我非常了解他们的用途。它声明:

全部:

  

如果子查询返回零行,则条件的计算结果为TRUE。

任何:

  

如果子查询返回零行,则条件的计算结果为FALSE。

这对我来说似乎不合逻辑。为什么空子查询中的ALL将返回TRUE但是ANY返回FALSE?

我对SQL比较新,所以我认为它会有这种行为的用例,这对我来说是非常直观的。

空集上的ANY和ALL应返回相同的值no?

2 个答案:

答案 0 :(得分:6)

考虑该链接中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,因为没有人的工资低于你,你希望至少有一个。

如果是ALL,你会问的一个显而易见的问题是“我的工资是否高于每个人?”。将其描述为“没有人的工资比我高吗?”当没有返回任何行时,你的答案是TRUE,因为“确实没有人的工资比我大。

答案 1 :(得分:4)

因为ANY将被解释为EXIST(如果有的话,则表示它们存在)。因此,如果没有找到行,则返回false。

All不保证存在任何值,它只是证明它代表所有可能的值。因此,即使没有找到行,它也会返回true。