SQL Set-Comparision 运算符 ANY 和 IN 差异



我有一个基本的SQL问题。为了能够正确解释它。我会给出它们的模式.

Sailors(sid:integer,sname:string,rating:integer)(sid 是主键。

现在,查询是"查找评级大于某个叫霍雷肖的水手"的水手(将有多个霍雷肖,因为sname不是主键)

答案是:

SELECT *
FROM Sailors S
WHERE S.rating >ANY (SELECT S2.rating
                        FROM Sailors S2
                        WHERE S2.sname="HORATIO")

想知道,我可以用 IN 代替任何吗?如果我不这样做,有什么不同?有人可以帮助我吗?提前谢谢。

您不能在此子查询中使用 IN,因为:

  1. 当你说 > ANY 时,它会从外部查询返回那些行,其中评级高于子查询返回的任何评级的评级。
  2. 如果你使用IN,那么它将只返回那些与任何名叫霍雷肖的水手具有相同评级的水手。
请注意,第一个查询可能会返回名为"Horatio"的水手,因为一个名为"Horatio"

的水手的评级可能高于另一个名为"Horatio"的水手。

此外,如果子查询不返回任何行,ANY则返回FALSE

编辑好的,我不明白你的问题。不能将< > =等运算符与IN一起使用,它们只能与ANYSOMEALL一起使用。

查看此处以获取更多信息: 蒂姆·霍尔关于任何,一些和所有

我认为你不能为此使用in,但你可以使用exists

select *
from Sailors S
where
    exists (
        select *
        from Sailors S2
        where S2.sname = 'HORATIO' and S.rating > S2.Rating
    )

我认为在这种情况下您不想使用 IN(设置包含)运算符。您需要找到一组合适的评级或一组名称。这些集合的搜索条件将与所需结果的搜索条件相同,那么为什么要打扰呢?

ANYSOMEALL运算符证明了SQL语言的高冗余特性(不是一个理想的特性),即使用许多构造总是可以实现相同的结果,你永远不需要使用ANYSOMEALL。的确,ANYSOME是同义词!

附言出于兴趣,这里有一种替代方法:

SELECT *
  FROM Sailors S
 WHERE S.rating > ( SELECT MIN( S2.rating )
                      FROM Sailors S2
                     WHERE S2.sname = 'HORATIO' );

最新更新