我只是偶然发现了ORACLE SQL中的某些内容(不确定是否在其他内容中),我很好奇。我在这里要求作为维基,因为很难尝试在谷歌中搜索符号......
我刚刚发现,根据一组值检查值时,您可以执行
WHERE x = ANY (a, b, c)
与通常的
相反WHERE x IN (a, b, c)
所以我很好奇,这两种语法的原因是什么?是一个标准和一个奇怪的Oracle语法?或者他们都是标准的?出于性能原因,是否有一个优先于另一个,或者?
好奇的是,任何人都可以告诉我有关'= ANY'语法的信息。 CheerZ!
答案 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 Server
,MySQL
和PostgreSQL
都支持此关键字。
答案 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#1005298 (Eddie 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 更自然。