SQL中IN和ANY操作符的区别

72
在SQL中,INANY操作符有什么区别?
11个回答

77
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操作符时,不能使用=、<>、<、>、<=或>=


4
在使用= ANY时,是否有理由优先选择其中一种方法?(当然,在除了=之外的其他运算符中使用ANY,因为IN仅适用于= - tscizzle
1
作为@tscizzle,我也想知道ANY/ALL是否提供任何特殊情况,其中=ANY或<>ALL与IN/NOT IN不同?对于标量子查询中>和<的使用MAX/MIN呢?我的意思是这纯粹是品味问题,还是有特殊情况下它们的作用不同?我尝试了一些空值和空集,但没有发现区别。 - Eske Rahn
1
有一种非常特殊的情况,它们显然更好,即 "=ALL" 和 "<>ANY",两者都测试集合中所有元素是否相等,如果相等/不相等于表达式值,则通过测试。但是,如果您需要那种奇怪的结构,那么"...WHERE value=ALL (SELECT a FROM Tbl)"比例如"...WHERE value=(SELECT MIN(a) FROM Tbl HAVING MIN(a)=MAX(a))"更易读 - 尽管我认为我从未需要过这种结构... - Eske Rahn

32

IN - 匹配列表中的任意值

ANY - 将值与子查询返回的每个值进行比较。

ALL - 将值与子查询返回的每个值进行比较。

例如:

IN:

显示所有工资与部门最低投资额相匹配的员工详细信息?

 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


28

也许为了更好地理解,这两个条件是等同的。使用哪一个取决于个人口味(前提是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


1
这是我个人认为更简单(也更好)的答案 - y o

11

使用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

返回一个与以下查询结果相同的结果集:
SELECT empno, sal FROM emp WHERE sal > 2000 OR sal > 3000 OR sal > 4000;

但请注意,它们在空集上的行为非常奇怪...所有六个“ALL”变体始终返回true,而所有六个“ANY”变体始终返回false。例如尝试“SELECT 5 WHERE 4=ALL (SELECT 1 WHERE 2=3)” - Eske Rahn

5

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


现在清楚了。 - kta

4

SQL Server 2008R2中的任何运算符。

以 > 比较运算符为例,>ALL 表示大于所有值,也就是大于最大值。例如,>ALL (1, 2, 3) 表示大于3。>ANY 表示大于至少一个值,也就是大于最小值。因此,>ANY (1, 2, 3) 表示大于1。

类似地,>ANY 表示为了满足外部查询中指定的条件,引入子查询的列中的值必须大于子查询返回的值列表中的至少一个值。


3

使用ANY时,需要一个运算符:

WHERE X > ANY (SELECT Y FROM Z)

使用IN操作符,无法进行其他比较操作。它只能用于相等性测试。


2

= ANY 相当于 IN 运算符。"<>, <, >, <=, 或 >=" 可以放在 ANY 运算符之前。
注意,<> ANY 运算符与 NOT IN 不同。

ANY 和 ALL 运算符与 WHERE 或 HAVING 子句一起使用。

如果子查询中的任何值满足条件,则 ANY 运算符返回 true。

如果子查询中的所有值都满足条件,则 ALL 运算符返回 true。


1

ANY 和 ALL 运算符与 WHERE 或 HAVING 子句一起使用。

如果子查询中的任何值满足条件,则 ANY 运算符返回 true。

如果子查询中的所有值都满足条件,则 ALL 运算符返回 true。


0

(in) 是一种特殊的运算符,用于从我们指定的值列表中逐个选择值。而 (any) 则与 where 子句一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接