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

Rom*_*kar 11 mysql sql sql-server postgresql ansi-sql

我在10年使用SQL(SQL服务器,PostgreSQL的),并且仍然我从来没有使用过ANY/SOMEALL关键字在我的生产代码.我遇到的所有情况我可以逃脱IN,MAX,MIN,EXISTS,,我认为这是更具可读性.

例如:

-- = 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);
Run Code Online (Sandbox Code Playgroud)

要么

-- < 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);
Run Code Online (Sandbox Code Playgroud)

使用ANY/SOMEALL:

所以问题是:我错过了什么吗?是否存在某种情况,ANY/SOMEALL在其他解决方案上闪耀?

Cra*_*ger 13

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

'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
Run Code Online (Sandbox Code Playgroud)

用我对这个问题的回答.

ANY,ALL他们否定可以极大地简化代码,会另有要求的不平凡的子查询或热膨胀系数,和他们显著是在我看来下使用.

考虑到这ANY将适用于任何运营商.这是非常方便的使用LIKE~,但将与tsquery,阵列会员测试工作,hstore关键测试,等等.

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

要么:

'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1,但你使用的是什么RDBMS?我试图让你的查询在PostgreSQL中工作,我能得到的最好就像任何(值('%lah'),('%fah'),('%dah'));`[SQL FIDDLE] (http://sqlfiddle.com/#!12/ac24b/9) (2认同)
  • 它需要是'ANY(ARRAY [...]).但是,这通常非常有用. (2认同)

Bil*_*win 6

不,我从未使用过ANY,ALLSOME关键字,我从未见过在其他人的代码中使用它们.我假设这些是残留语法,就像SQL中某些地方出现的各种可选关键字一样(例如AS).

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

  • +1但是`AS`有什么问题?我喜欢 :) (3认同)