1

我有一个基本的 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 吗?如果我不这样做,有什么不同?有没有人可以帮助我?提前致谢。

4

3 回答 3

4

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

  1. 当您说> ANY时,它会从外部查询返回评级高于子查询返回的任何评级的评级的那些行。
  2. 如果您使用IN,那么它将仅返回与任何名为 Horatio 的水手具有相同等级的水手。

请注意,第一个查询可能返回名为“Horatio”的水手,因为一个名为“Horatio”的水手可能比另一个名为“Horatio”的水手具有更高的评级。

此外,如果子查询没有返回行ANY,则返回。FALSE

编辑好的,我不明白你的问题。您不能将< > =etc. 运算符与 一起使用IN,它们只能与ANY,SOME和一起使用ALL

在这里查看更多信息:Tim Hall 关于 ANY、SOME 和 ALL

于 2013-11-06T18:45:16.300 回答
3

我不认为你可以使用in这个,但你可以使用exists

select *
from Sailors S
where
    exists (
        select *
        from Sailors S2
        where S2.sname = 'HORATIO' and S.rating > S2.Rating
    )
于 2013-11-06T18:44:55.973 回答
1

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

, ANY,运算SOMEALL展示了 SQL 语言的高冗余特性(不是一个理想的特性),即始终可以使用许多构造来获得相同的结果,而您永远不需要使用ANY, SOME, ALL。确实,ANYSOME都是同义词!

ps 出于兴趣,这里有另一种方法:

SELECT *
  FROM Sailors S
 WHERE S.rating > ( SELECT MIN( S2.rating )
                      FROM Sailors S2
                     WHERE S2.sname = 'HORATIO' );
于 2013-11-07T09:42:27.487 回答