我正在阅读ANY和ALL运算符上的oracle documentation。除了一件事,我非常了解他们的用途。它声明:
全部:
如果子查询返回零行,则条件的计算结果为TRUE。
任何:
如果子查询返回零行,则条件的计算结果为FALSE。
这对我来说似乎不合逻辑。为什么空子查询中的ALL将返回TRUE但是ANY返回FALSE?
我对SQL比较新,所以我认为它会有这种行为的用例,这对我来说是非常直观的。
空集上的ANY和ALL应返回相同的值no?
答案 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。