SQL集 - 比较运算符ANY和IN的区别

时间:2013-11-06 18:42:07

标签: sql database predicate

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

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

现在,查询是“查找评级大于某个名为Horatio的水手的水手”(此后将有多个Horatio,sname不是主键)

答案是:

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

我想知道,我可以使用IN而不是ANY吗?如果我不,有什么不同?有人帮我吗?提前谢谢。

3 个答案:

答案 0 :(得分:4)

您无法在此子查询中使用IN,因为:

  1. 当您说> ANY时,它会返回外部查询中的那些行,其中评级高于子查询返回的任何评级的评级。
  2. 如果您使用IN,那么它将仅返回与任何名为Horatio的水手具有相同等级的水手。
  3. 请注意,第一个查询可能会返回名为“Horatio”的水手,因为一个名为“Horatio”的水手可能比另一个名为“Horatio”的水手具有更高的评级。

    此外,如果子查询没有返回任何行,ANY将返回FALSE

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

    请点击此处了解详情:Tim Hall about ANY, SOME and ALL

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

ANYSOMEALL运算符演示了SQL语言的高冗余性质(不是理想的功能),即使用许多结构始终可以实现相同的结果,从不需要使用ANYSOMEALL。实际上,ANYSOME是同义词!

P.S。为了兴趣,这是另一种方法:

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