IN
和ANY
操作符有什么区别?SQL>
SQL> -- Use the ANY operator in a WHERE clause to compare a value with any of the values in a list.
SQL>
SQL> --在任何值之前,您必须放置=、<>、<、>、<=或>=运算符。
SQL> SELECT *
2 FROM employee
3 WHERE salary > ANY (2000, 3000, 4000);
用于 In 运算符的语法
SQL> -- Use the IN operator in a WHERE clause to compare a value with any of the values in a list.
SQL> SELECT *
2 FROM employee
3 WHERE salary IN (2000, 3000, 4000);
使用IN操作符时,不能使用=、<>、<、>、<=或>=
IN - 匹配列表中的任意值
ANY - 将值与子查询返回的每个值进行比较。
ALL - 将值与子查询返回的每个值进行比较。
例如:
显示所有工资与部门最低投资额相匹配的员工详细信息?
Select Ename, Sal, Deptno
from Emp
Where Sal IN (Select Min(Sal)
From Emp
Group By Deptno);
< 任意
表示小于列表中的最大值。
获取所有收入低于最高收入经理的员工的详细信息?
Select Empno, Ename, Job, Sal
From Emp
Where Sal < Any (Select Distinct MGR
From Emp);
> ANY
表示大于列表中的最小值。
获取所有在第10个部门中薪资高于最低薪资的员工的详细信息?
Select Empno, Ename, Job, Sal
From Emp
Where Sal > Any (Select Min(Sal)
From Emp
Where Deptno 10);
= ANY
相当于使用 in 操作符。
注意: SOME
也可以代替使用 ANY
。
也许为了更好地理解,这两个条件是等同的。使用哪一个取决于个人口味(前提是RDBMS支持它们)
... WHERE x IN (SELECT Y FROM THE_TABLE)
... WHERE x =ANY (SELECT Y FROM THE_TABLE)
还有这些
... WHERE x NOT IN (SELECT Y FROM THE_TABLE)
... WHERE x <>ALL (SELECT Y FROM THE_TABLE)
实际上,我个人的习惯是在列表表达式中使用 IN
(比如 WHERE x IN (2,4,6,8)
),而在子查询中则使用 =ANY
或 <>ALL
。
使用ALL关键字时
SELECT empno, sal FROM emp WHERE sal > ALL (2000, 3000, 4000);
当使用ALL关键字时,SQL语句将返回所有满足条件的记录,这些记录中的sal字段值都大于2000、3000和4000。 EMPNO SAL
7839 5000
它将返回与以下查询等效的结果:
SELECT empno, sal FROM emp WHERE sal > 2000 AND sal > 3000 AND sal > 4000;
使用任何一种方式
SELECT empno, sal FROM emp WHERE sal > ANY (2000, 3000, 4000);
EMPNO SAL
7566 2975
7698 2850
7782 2450
7788 3000
7839 5000
7902 3000
IN - 简单易懂。查询应该只选择指定在“IN”子句中的值。 现在,让我们通过一个查询来理解“ANY”。 ANY意味着它应该大于或小于列表中的任何一个值。
假设有一个订单表,其中OrderID从1到10
请观察以下查询:
select OrderID from Orders
where OrderID < ANY (3,5,7)
以上查询的答案是:
OrderID
1,2,3,4,5,6
说明:该查询表示查找OrderID少于指定值的任何一个的订单ID。 因此,数据库搜索并包括如下OrderID:
1<3-是,因此包括OrderID 1
2<3-是,因此包括OrderID 2
3<3-否,3<5-是(因为指定了5),因此包括OrderID 3
4<3-否,4<5-是,因此包括OrderID 4
5<3-否,5<5-否,5<7(因为指定了5)-是,因此包括OrderID 5
6<3-否,6<5-否,6<7-是,因此包括OrderID 6
7<3-否,7<5-否,7<7-否,因此不包括OrderID 7,因为没有更多值在指定的列表中进行比较
8<3-否,8<5-否,8<7-否,因此不包括OrderID 8,因为没有更多值在指定的列表中进行比较
9<3-否,9<5-否,9<7-否,因此不包括OrderID 9,因为没有更多值在指定的列表中进行比较
10<3-否,10<5-否,10<7-否,因此不包括OrderID 10,因为没有更多值在指定的列表中进行比较
对于大于操作应用相同的逻辑
select OrderID from Orders
where OrderID > ANY (3,5,7)
以上查询的答案是:
OrderID
4,5,6,7,8,9,10
SQL Server 2008R2中的任何运算符。
以 > 比较运算符为例,>ALL 表示大于所有值,也就是大于最大值。例如,>ALL (1, 2, 3) 表示大于3。>ANY 表示大于至少一个值,也就是大于最小值。因此,>ANY (1, 2, 3) 表示大于1。
类似地,>ANY 表示为了满足外部查询中指定的条件,引入子查询的列中的值必须大于子查询返回的值列表中的至少一个值。
使用ANY时,需要一个运算符:
WHERE X > ANY (SELECT Y FROM Z)
使用IN操作符,无法进行其他比较操作。它只能用于相等性测试。
= ANY 相当于 IN 运算符。"<>, <, >, <=, 或 >=" 可以放在 ANY 运算符之前。
注意,<> ANY 运算符与 NOT IN 不同。
ANY 和 ALL 运算符与 WHERE 或 HAVING 子句一起使用。
如果子查询中的任何值满足条件,则 ANY 运算符返回 true。
如果子查询中的所有值都满足条件,则 ALL 运算符返回 true。
ANY 和 ALL 运算符与 WHERE 或 HAVING 子句一起使用。
如果子查询中的任何值满足条件,则 ANY 运算符返回 true。
如果子查询中的所有值都满足条件,则 ALL 运算符返回 true。
(in) 是一种特殊的运算符,用于从我们指定的值列表中逐个选择值。而 (any) 则与 where 子句一起使用。
= ANY
时,是否有理由优先选择其中一种方法?(当然,在除了=
之外的其他运算符中使用ANY
,因为IN
仅适用于=
) - tscizzle