ALL运算符VS Any对空查询

use*_*315 5 sql oracle

我正在阅读关于ANY和ALL运算符的oracle文档.除了一件事,我非常了解他们的用途.它指出:

全部:

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

任何 :

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

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

我对SQL比较陌生,所以我认为它会对这种行为有一个用例,这对我来说是非常直观的.

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

Jea*_*ard 8

因为ANY被解释为EXIST(如果有,则意味着它们存在)。因此,如果未找到行,则返回 false。

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

  • 值得一提的例子:如果你有一个像 `empSalary > ALL(从 someTable 中选择薪水)` 那样的检查,如果 `从 someTable 中选择薪水` 上没有行,它评估为真,因为你正在检查的值更大然后“所有值(即使它们不存在)” :) (2认同)

ruu*_*van 6

考虑该EMP链接中表格的示例.

特别是这个查询 -

SELECT e1.empno, e1.sal
FROM   emp e1
WHERE  e1.sal > ANY (SELECT e2.sal
                     FROM   emp e2
                     WHERE  e2.deptno = 20);
Run Code Online (Sandbox Code Playgroud)

如果是的话,你问的问题是"我的薪水是否比20级(至少1人)的任何人都高".这意味着你希望至少有一个人的薪水低于你.当没有行时,这会返回,FALSE因为没有人的工资低于你,你希望至少有一个.

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