【问题标题】:Difference between IN and ANY operators in SQLSQL中IN和ANY运算符的区别
【发布时间】:2010-09-13 09:56:58
【问题描述】:

SQL 中的INANY 运算符有什么区别?

【问题讨论】:

    标签: sql operators any


    【解决方案1】:
    SQL>
    SQL> -- Use the ANY operator in a WHERE clause to compare a value with any of the values in a list.
    SQL>
    

    SQL> -- 您必须在 ANY 之前放置 =、、、= 运算符。

    SQL> SELECT *
      2  FROM employee
      3  WHERE salary > ANY (2000, 3000, 4000);
    

    For 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 运算符,您不能使用 =、、、=

    【讨论】:

    • 在执行= ANY 时是否有理由使用其中一个? (当然,除了= 之外的其他运算符使用 ANY 因为IN 仅适用于=
    • 作为@tscizzle,我还想知道 ANY/ALL 是否提供任何特殊情况,其中 =ANY 或 ALL 与 IN/NOT IN 不同?对于 > 和
    • 有一个非常特殊的情况,它们显然更好,奇怪的“=ALL”和“ANY”,两个测试集合中的所有是否相等,如果相等/不同到表达式值。但是,如果您需要那种奇怪的结构,那么“...WHERE value=ALL (SELECT a FROM Tbl)”比 e.g. 更具可读性。 “...WHERE value=(SELECT MIN(a) FROM Tbl HAVING MIN(a)=MAX(a))” - 我认为我不需要那种构造...
    【解决方案2】:

    IN - 等于列表中的任何内容

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

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

    例如:

    在:

    显示所有工资与部门投资最少的员工的详细信息?

     Select Ename, Sal, Deptno 
     from Emp 
     Where Sal IN (Select Min(Sal) 
                   From Emp 
                   Group By Deptno);
    

    任何:

    < ANY 表示小于列表中的最大值。

    获取所有收入低于最高收入经理的员工的详细信息?

     Select Empno, Ename, Job, Sal 
     From Emp
     Where Sal < Any (Select Distinct MGR 
                      From Emp);
    

    &gt; ANY 表示大于列表中的最小值。

    获取第 10 部门收入高于最低工资的所有员工的详细信息?

     Select Empno, Ename, Job, Sal 
     From Emp
     Where Sal > Any (Select Min(Sal) 
                      From Emp 
                      Where Deptno 10);
    

    = ANY 相当于 in 运算符。

    注意:SOME 也可以用来代替ANY

    【讨论】:

      【解决方案3】:

      也许为了更好的理解,这两个条件是等价的。使用哪一个是个人喜好问题(前提是 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,分别用&lt;&gt;ALL来表达子查询。

      【讨论】:

      • 这是 IMO 更简单(更好)的答案
      【解决方案4】:

      使用全部时

      选择 empno, 萨尔 来自雇员 哪里 sal > ALL (2000, 3000, 4000);

       EMPNO        SAL
      

        7839       5000
      

      它会返回相当于查询的结果:

      选择 empno, 萨尔 来自雇员 哪里萨尔 > 2000 和萨尔 > 3000 和萨尔 > 4000;

      使用任一时

      选择 empno, 萨尔 来自雇员 WHERE sal > ANY (2000, 3000, 4000);

       EMPNO        SAL
      

        7566       2975
        7698       2850
        7782       2450
        7788       3000
        7839       5000
        7902       3000
      

      返回与

      相同的结果

      选择 empno, 萨尔 来自雇员 其中sal > 2000 或sal > 3000 或sal > 4000;

      【讨论】:

      • 但是请注意,它们在空集上的行为非常奇怪......所有六个“ALL”变体总是返回 true,所有六个“ANY”变体总是返回 false。尝试例如" SELECT 5 WHERE 4=ALL (SELECT 1 WHERE 2=3) "
      【解决方案5】:

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

      WHERE X > ANY (SELECT Y FROM Z)
      

      使用 IN,您不能。它总是在测试是否相等。

      【讨论】:

        【解决方案6】:

        SQL SERVER 2008R2 中的 ANY 和 ALL 运算符。

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

        同理,>ANY 表示对于满足外部查询中指定条件的行,引入子查询的列中的值必须大于子查询返回的值列表中的至少一个值.

        【讨论】:

          【解决方案7】:

          IN - 这很容易理解。查询应该只选择那些在“IN”子句中指定的值。 现在,让我们通过查询来理解“ANY”。 ANY 表示它应该大于或小于列表中的任何值。

          假设 Orders 表的 OrderID 从 1 到 10

          观察以下查询:
          从订单中选择 OrderID
          其中 OrderID

          上述问题的答案是:
          订单编号
          1,2,3,4,5,6

          解释:查询说查找小于任何指定值的 OrderID。因此数据库搜索并包含 OrderID 如下:
          是 1 是 2 是 3 是 4 是 5 是 6 是 7 是 8 是 9 是 9


          对大于应用相同的逻辑
          从订单中选择 OrderID
          其中 OrderID > ANY (3,5,7)

          上述问题的答案是:
          订单编号
          4,5,6,7,8,9,10

          【讨论】:

          • 现在很清楚了。
          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

            = ANY 相当于 IN 运算符。 "、、=" 其中之一可以放在任何运算符之前。 请注意, ANY 运算符与 NOT IN 不同。

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

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

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

            【讨论】:

              【解决方案10】:

              当我们使用“IN”比较任何列值时,某些集合说{value1,value2 ...},那么列值必须存在于集合中,但如果是 ANY,我们会这样比较:

              col.value > ANY ({value1,value2,...})
              

              那么该值必须大于任何一个设定值。

              如果是“全部”

              col.value> ALL({value1,value2,...})
              

              该值必须大于集合中的所有值。

              请参阅以下图片以更好地理解:

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  猜你喜欢
                  • 2022-10-18
                  • 1970-01-01
                  • 2019-09-25
                  • 2015-07-16
                  • 2016-04-10
                  • 2021-12-18
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多