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 Server
, MySQL
和PostgreSQL
支持这个关键字。
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运算符。