我有一个基本的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吗?如果我不,有什么不同?有人帮我吗?提前谢谢。
答案 0 :(得分:4)
您无法在此子查询中使用IN,因为:
> ANY
时,它会返回外部查询中的那些行,其中评级高于子查询返回的任何评级的评级。IN
,那么它将仅返回与任何名为Horatio的水手具有相同等级的水手。请注意,第一个查询可能会返回名为“Horatio”的水手,因为一个名为“Horatio”的水手可能比另一个名为“Horatio”的水手具有更高的评级。
此外,如果子查询没有返回任何行,ANY
将返回FALSE
。
编辑好的,我不明白你的问题。您不能将< > =
等运营商与IN
一起使用,它们只能与ANY
,SOME
和ALL
一起使用。
请点击此处了解详情: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
(设置包含)运算符。您需要找到一组适当的评级或一组名称。这些集合的搜索条件与期望结果的搜索条件相同,所以为什么要这么麻烦?
ANY
,SOME
,ALL
运算符演示了SQL语言的高冗余性质(不是理想的功能),即使用许多结构始终可以实现相同的结果,从不需要使用ANY
,SOME
,ALL
。实际上,ANY
和SOME
是同义词!
P.S。为了兴趣,这是另一种方法:
SELECT *
FROM Sailors S
WHERE S.rating > ( SELECT MIN( S2.rating )
FROM Sailors S2
WHERE S2.sname = 'HORATIO' );