我有一个基本的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,因为:
- 当你说
> ANY
时,它会从外部查询返回那些行,其中评级高于子查询返回的任何评级的评级。 - 如果你使用
IN
,那么它将只返回那些与任何名叫霍雷肖的水手具有相同评级的水手。
的水手的评级可能高于另一个名为"Horatio"的水手。
此外,如果子查询不返回任何行,ANY
则返回FALSE
。
编辑好的,我不明白你的问题。不能将< > =
等运算符与IN
一起使用,它们只能与ANY
、SOME
和ALL
一起使用。
查看此处以获取更多信息: 蒂姆·霍尔关于任何,一些和所有
我认为你不能为此使用in
,但你可以使用exists
:
select *
from Sailors S
where
exists (
select *
from Sailors S2
where S2.sname = 'HORATIO' and S.rating > S2.Rating
)
我认为在这种情况下您不想使用 IN
(设置包含)运算符。您需要找到一组合适的评级或一组名称。这些集合的搜索条件将与所需结果的搜索条件相同,那么为什么要打扰呢?
ANY
、SOME
、ALL
运算符证明了SQL语言的高冗余特性(不是一个理想的特性),即使用许多构造总是可以实现相同的结果,你永远不需要使用ANY
、SOME
、ALL
。的确,ANY
和SOME
是同义词!
附言出于兴趣,这里有一种替代方法:
SELECT *
FROM Sailors S
WHERE S.rating > ( SELECT MIN( S2.rating )
FROM Sailors S2
WHERE S2.sname = 'HORATIO' );