SQL:我们需要ANY / SOME和ALL关键字吗?

时间:2013-07-11 08:01:19

标签: mysql sql sql-server postgresql ansi-sql

我使用SQL(SQL Server,PostgreSQL)超过10年,但我仍然没有在我的生产代码中使用ANY/SOMEALL个关键字。我遇到的所有情况都可以通过INMAXMINEXISTS来解决,我认为它更具可读性。

例如:

-- = ANY
select * from Users as U where U.ID = ANY(select P.User_ID from Payments as P);

-- IN
select * from Users as U where U.ID IN (select P.User_ID from Payments as P);

或者

-- < ANY
select * from Users as U where U.Salary < ANY(select P.Amount from Payments as P);

-- EXISTS
select * from Users as U where EXISTS (select * from Payments as P where P.Amount > U.Salary);

使用ANY/SOMEALL

所以问题是:我错过了什么吗?是否存在ANY/SOMEALL超越其他解决方案的情况?

3 个答案:

答案 0 :(得分:13)

当你不只是测试平等或不平等时,我发现ANY和ALL非常有用。考虑

'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);

as used my answer to this question

ANYALL及其否定可以极大地简化原本需要非平凡子查询或CTE的代码,并且在我看来它们的使用率非常低。

考虑ANY可以与任何运营商合作。它对LIKE~非常方便,但可以使用tsquery,数组成员资格测试,hstore密钥测试等。

'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])

或:

'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])

如果没有ANYALL,您可能必须在VALUES列表中将这些表示为子查询或CTE,并使用聚合生成单个结果。当然,如果你愿意,你可以这样做,但我会坚持ANY

这里有一个真实的警告:在较旧的Pg版本中,如果您正在撰写ANY( SELECT ... ),那么您在EXISTS (SELECT 1 FROM ... WHERE ...)的性能方面几乎肯定会更好。如果您使用的是优化程序将ANY (...)转换为联接的版本,则无需担心。如有疑问,请检查EXPLAIN输出。

答案 1 :(得分:6)

不,我从未使用ANYALLSOME关键字,而且我从未在其他人的代码中看到过这些关键字。我假设这些是残留语法,就像SQL中某些地方出现的各种可选关键字一样(例如,AS)。

请记住,SQL是由委员会定义的。

答案 2 :(得分:0)

我曾尝试过任何事情,但没有遗漏任何东西,只有在我使用Not条件时才会有不同类型的习惯。存在和将需要添加而不是任何/某些只是将运算符更改为<>。我只使用sql server,我不确定其他软件是否可能遗漏了什么