Oracle:'= ANY()'与'IN()'

时间:2010-02-19 18:07:27

标签: sql oracle syntax

我只是偶然发现了ORACLE SQL中的某些内容(不确定是否在其他内容中),我很好奇。我在这里要求作为维基,因为很难尝试在谷歌中搜索符号......

我刚刚发现,根据一组值检查值时,您可以执行

WHERE x = ANY (a, b, c)

与通常的

相反
WHERE x IN (a, b, c)

所以我很好奇,这两种语法的原因是什么?是一个标准和一个奇怪的Oracle语法?或者他们都是标准的?出于性能原因,是否有一个优先于另一个,或者?

好奇的是,任何人都可以告诉我有关'= ANY'语法的信息。 CheerZ!

10 个答案:

答案 0 :(得分:31)

ANY(或其同义词SOME)是EXISTS的语法糖,具有简单的相关性:

SELECT  *
FROM    mytable
WHERE   x <= ANY
        (
        SELECT  y
        FROM    othertable
        )

与:

相同
SELECT  *
FROM    mytable m
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    othertable o
        WHERE   m.x <= o.y
        )

在非可空字段上使用相等条件,它变得类似于IN

所有主要数据库(包括SQL ServerMySQLPostgreSQL都支持此关键字。

答案 1 :(得分:19)

IN- Equal to any member in the list
ANY- Compare value to **each** value returned by the subquery
ALL- Compare value to **EVERY** value returned by the subquery

<ANY() - less than maximum
>ANY() - more than minimum
=ANY() - equivalent to IN
>ALL() - more than the maximum
<ALL() - less than the minimum

例如:

找到与每个部门的最低工资相同薪水的员工:

SELECT last_name, salary,department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
                 FROM employees
                 GROUP BY department_id);

非IT程序员且薪水低于任何IT程序员的员工

SELECT employee_id, last_name, salary, job_id
FROM employees
WHERE salary <ANY
                (SELECT salary
                 FROM employees
                 WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

薪水低于所有员工薪水的员工,其职位ID为IT_PROG且其工作不是IT_PROG:

SELECT employee_id,last_name, salary,job_id
FROM employees
WHERE salary <ALL
                (SELECT salary
                 FROM employees
                 WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

....................

希望它有所帮助。 -Noorin Fatima

答案 2 :(得分:16)

简单地说一下,引用O'Reilly的“掌握Oracle SQL”:

  

“在子查询中使用IN在功能上等同于使用ANY,如果在子查询返回的集合中找到匹配,则返回TRUE。”

     

“我们认为你会同意IN比任何人更直观,这就是为什么IN几乎总是在这种情况下使用。”

希望能够解决有关ANY与IN的问题。

答案 3 :(得分:9)

相信你正在寻找的是:

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005298Eddie Awad's Blog上的链接) 总结一下:

  

last_name IN ('SMITH', 'KING', 'JONES')

     

转化为

     

last_name = 'SMITH' OR last_name = 'KING' OR last_name = 'JONES'

,而

  

salary > ANY (:first_sal, :second_sal)

     

转化为

     

salary > :first_sal OR salary > :second_sal

     

优化程序转换条件   使用ANY或SOME运算符   然后将子查询转换为   包含EXISTS的条件   运算符和相关子查询

答案 4 :(得分:6)

ANY语法允许您编写类似

的内容
WHERE x > ANY(a, b, c)

或事件

WHERE x > ANY(SELECT ... FROM ...)

不确定地球上是否有人使用任何人(及其兄弟ALL)。

答案 5 :(得分:5)

快速谷歌发现了这个http://theopensourcery.com/sqlanysomeall.htm

任何允许你使用除=以外的运算符,在大多数其他方面(空值的特殊情况),它的作用类似于IN。您可以将IN视为任何与=运算符。

答案 6 :(得分:1)

这是一个标准。 SQL 1992标准状态

  

8.4&lt; in predicate&gt;

     

[...]

<in predicate> ::=
    <row value constructor>
      [ NOT ] IN <in predicate value>
     

[...]

     

2)设RVC为&lt;行值构造函数&gt;并且让IPV为&lt; in谓词值&gt;。

     

[...]

     

4)表达式

  RVC IN IPV
     

相当于

  RVC = ANY IPV  

事实上,<in predicate>行为定义基于8.7 <quantified comparison predicate>。换句话说,Oracle在这里正确实现了SQL标准

答案 7 :(得分:1)

也许其中一篇链接文章指出了这一点,但是当找到匹配(=)时,两者返回相同的东西并不是真的。但是,如果要查找一系列答案(&gt;,&lt;等),则无法使用“IN”并且必须使用“ANY”......

我是个新手,请原谅我,如果我错过了一些明显的东西......

答案 8 :(得分:1)

MySql很好地清除了它的文档中的任何内容:

  

ANY关键字必须遵循比较运算符,表示   “如果对于任何值的比较为TRUE,则返回TRUE   子查询返回的列。“例如:

SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

  

假设表t1中有一行包含(10)。该   如果表t2包含(21,14,7),则表达式为TRUE,因为有一个   t2中的值7小于10.如果是表,则表达式为FALSE   t2包含(20,10),或者如果表t2为空。表达是   如果表t2包含(NULL,NULL,NULL),则为unknown(即NULL)。

https://dev.mysql.com/doc/refman/5.5/en/any-in-some-subqueries.html

Alan Beaulieu的学习SQL也说明如下:

  

虽然大多数人更喜欢使用IN,但使用= ANY相当于   使用IN运算符。

答案 9 :(得分:0)

为什么我总是使用 any 是因为在某些 oracle 或 mssql 版本中,IN 列表受 1000/999 个元素的限制。而 = any () 不受 1000 的限制。

没有人喜欢他们的 sql 查询使 Web 请求崩溃。 因此存在实际差异。

第二个原因是更现代的形式。因为它与 > all (...) 之类的表达式相关。

第三个原因对我来说是非英语母语者,使用“any”和“all”似乎比使用 IN 更自然。