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

我只是偶然发现了ORACLE SQL中的某些东西(不知道它是否在别人中),我很好奇。 我在这里问作为一个维基,因为很难尝试在谷歌search符号…

我刚刚发现,当检查一个值,你可以做一组值

WHERE x = ANY (a, b, c) 

与平时相反

 WHERE x IN (a, b, c) 

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

只是好奇,有什么人可以告诉我有关'= ANY'的语法。 CheerZ!

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 mx <= oy ) 

在不可空字段上的相等条件与IN类似。

所有主要的数据库,包括SQL ServerMySQLPostgreSQL支持这个关键字。

 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 

例如:

find与每个部门的最低工资相同的工资:

 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'; 

员工工资低于IT_PROG职位ID为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法蒂玛

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

“在子查询中使用IN在function上等同于使用ANY,如果在子查询返回的集合中find匹配项,则返回TRUE。

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

希望清除你关于ANY和IN的问题。

相信你正在寻找的是这样的:

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005298 (链接在Eddie Awad的博客上find)总结这里:

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运算符和相关子查询的条件

ANY语法允许你写一些类似的东西

 WHERE x > ANY(a, b, c) 

或事件

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

不确定地球上是否真的有人使用ANY(和它的兄弟ALL)。

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

任何允许你使用除=以外的操作符,在大多数其他方面(特殊情况下为空),它就像IN一样。 您可以使用=运算符将IN视为ANY。

这是一个标准。 SQL 1992标准规定

8.4 <谓词>

[…]

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

[…]

2)设RVC为<行值构造函数>,让IPV为<谓词值>。

[…]

4)expression

  RVC IN IPV 

相当于

  RVC = ANY IPV 

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

也许其中一个链接文章指出了这一点,但是当寻找匹配(=)时,这两者返回相同的东西并不是真的。 但是,如果寻找一系列的答案(>,<等),你不能使用“IN”,将不得不使用“任何”…

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

MySql很好的清除了任何文档:

ANY关键字必须遵循比较运算符,意思是“如果比较结果为TRUE,则子查询返回的列中的任何值都返回TRUE”。例如:

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

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

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

另外Alan Beaulieu学习SQL指出:

尽pipe大多数人更喜欢使用IN,但使用= ANY等同于使用IN运算符。