eid*_*lon 51 sql oracle syntax
我只是偶然发现了ORACLE SQL中的一些内容(不确定是否在其他内容中),我很好奇.我在这里要求作为维基,因为很难尝试在谷歌中搜索符号...
我刚刚发现,在根据一组值检查值时,您可以执行此操作
WHERE x = ANY (a, b, c)
Run Code Online (Sandbox Code Playgroud)
与通常相反
WHERE x IN (a, b, c)
Run Code Online (Sandbox Code Playgroud)
所以我很好奇,这两种语法的原因是什么?是一个标准和一个奇怪的Oracle语法?或者他们都是标准的?出于性能原因,是否有一个优先于另一个,或者?
只是好奇有人可以告诉我关于'= ANY'语法的内容.CheerZ!
Qua*_*noi 34
ANY
(或其同义词SOME
)是EXISTS
具有简单相关性的语法糖:
SELECT *
FROM mytable
WHERE x <= ANY
(
SELECT y
FROM othertable
)
Run Code Online (Sandbox Code Playgroud)
是相同的:
SELECT *
FROM mytable m
WHERE EXISTS
(
SELECT NULL
FROM othertable o
WHERE m.x <= o.y
)
Run Code Online (Sandbox Code Playgroud)
在非可空字段上具有相等条件,它变得类似于IN
.
所有主要的数据库,包括SQL Server
,MySQL
和PostgreSQL
,支持该关键字.
小智 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
Run Code Online (Sandbox Code Playgroud)
例如:
找到与每个部门的最低工资相同薪水的员工:
SELECT last_name, salary,department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
FROM employees
GROUP BY department_id);
Run Code Online (Sandbox Code Playgroud)
非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';
Run Code Online (Sandbox Code Playgroud)
薪水低于所有员工薪水的员工,其工作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';
Run Code Online (Sandbox Code Playgroud)
....................
希望能帮助到你.-Noorin Fatima
Cra*_*igH 16
简单地说一下,引用O'Reilly的"掌握Oracle SQL":
"在子查询中使用IN在功能上等同于使用ANY,如果在子查询返回的集合中找到匹配,则返回TRUE."
"我们认为你会同意IN比任何人更直观,这就是为什么IN几乎总是在这种情况下使用的原因."
希望能够解决你关于ANY和IN的问题.
我相信你要找的是这个:
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005298(Enddie Awad博客 上的链接)总结一下:
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)
Run Code Online (Sandbox Code Playgroud)
或事件
WHERE x > ANY(SELECT ... FROM ...)
Run Code Online (Sandbox Code Playgroud)
不确定这个星球上是否有人使用ANY(及其兄弟ALL).
一个快速谷歌找到了这个http://theopensourcery.com/sqlanysomeall.htm
任何允许你使用除=以外的运算符,在大多数其他方面(空值的特殊情况)它的行为类似于IN.使用=运算符可以将IN视为ANY.