IN语法糖来自= ANY吗?

时间:2019-04-19 15:55:01

标签: sql

1)据我了解,比较= ANY看起来与IN非常相似。是这样吗?例如:

SELECT * FROM HOUSES 
WHERE TYPE = ANY (SELECT TYPE FROM TYPES WHERE CAT_ID = 'PUBLIC')

总是等于说吗?

SELECT * FROM HOUSES 
WHERE TYPE IN (SELECT TYPE FROM TYPES WHERE CAT_ID = 'PUBLIC')

2)那不可以吗?它等于<> ALL吗?我倾向于认为是,但是看不清。

3 个答案:

答案 0 :(得分:3)

您对IN等同于= ANY是正确的。关于此主题,SQL:2016标准(ISO 9075-2:2016)表示:

  

8.4 <谓语>

     

[..]

     

语法规则

     

[..]

     

4)表达式

RVC NOT IN IPV
     

等同于

NOT ( RVC IN IPV )
     

5)表达式

RVC IN IPV
     

等同于

RVC = ANY IPV

在第5点,IN的等效点在第4点上可以回答您有关NOT IN的问题。

答案 1 :(得分:1)

我假设您的数据库支持ANY运算符(某些其他数据库不支持该运算符)。在逻辑上,将ANY=一起使用,然后再跟一个子查询,在逻辑上等同于使用IN和一个相同的子查询。但是区别在于ANY还支持其他比较运算符>>=<<=

比较<> ALL表示子查询中的每个记录等于LHS上的值。否定的是,子查询中存在一个或多个等于LHS的记录。因此,<> ALL的反义词只是IN

答案 2 :(得分:1)

  1. 是的,= ANY始终等于IN

    ANY 对值使用OR

    chosen = ANY('True', 'Yes')

    展开时:

    chosen = 'True' OR chosen = 'Yes'

    与:

    chosen IN ('True', 'Yes')

    展开时:

    chosen = 'True' OR chosen = 'Yes'

    ANY / IN都使用 OR

  2. 是的,NOT IN始终等于<> ALL

    ALL 对值使用AND

    chosen <> ALL ('Yes', 'True')

    展开时:

    chosen <> 'Yes' AND chosen <> 'True'

    与:

    chosen NOT IN ('Yes', 'True')

    与:

    NOT (chosen IN ('Yes', 'True'))

    展开时:

    NOT (chosen = 'Yes' OR chosen = 'True')

    应用De Morgan定理:

    chosen <> 'Yes' AND chosen <> 'True'

    <> ALL / NOT IN都使用 AND

如果有一个stackoverflow答案可以使我解释为“点击”,我就尝试用google搜索。

在法定人数上发现了answer

注意,伪代码在前。该查询将无法立即使用。为了使查询真正起作用,请将列表封装为可以对“任何” /“全部”进行操作的列表,例如array values

“任何”:等同于“ OR” 条件。因此,在下面的示例中,当考虑薪金> 2000或3000或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

“全部”:等同于“ AND” 条件。因此,在下面的示例中,当考虑薪金> 2000以及3000和4000时

SELECT empno, sal
FROM   emp
WHERE  sal > ALL (2000, 3000, 4000);

     EMPNO        SAL
---------- ----------
      7839       5000

样本数据:

| empno |  ename |       job |  mgr |             hiredate |  sal | comm | deptno |
|-------|--------|-----------|------|----------------------|------|------|--------|
|  7369 |  smith |     clerk | 7902 | 1980-12-17T00:00:00Z |  800 | null |     20 |
|  7499 |  allen |  salesman | 7698 | 1981-02-20T00:00:00Z | 1600 |  300 |      0 |
|  7521 |   ward |  salesman | 7698 | 1981-02-22T00:00:00Z | 1250 |  500 |     30 |
|  7566 |  jones |   manager | 7839 | 1981-04-02T00:00:00Z | 2975 | null |     20 |
|  7654 | martin |  salesman | 7698 | 1981-09-28T00:00:00Z | 1250 | 1400 |     30 |
|  7698 |  blake |   manager | 7839 | 1981-05-01T00:00:00Z | 2850 | null |     30 |
|  7782 |  clark |   manager | 7839 | 1981-06-09T00:00:00Z | 2450 | null |     10 |
|  7788 |  scott |   analyst | 7566 | 1987-04-19T00:00:00Z | 3000 | null |     20 |
|  7839 |   king | president | null | 1981-11-17T00:00:00Z | 5000 | null |     10 |
|  7844 | turner |  salesman | 7698 | 1981-09-08T00:00:00Z | 1500 |    0 |     30 |
|  7876 |  adams |     clerk | 7788 | 1987-05-23T00:00:00Z | 1100 | null |     20 |
|  7900 |  james |     clerk | 7698 | 1981-12-03T00:00:00Z |  950 | null |     30 |
|  7902 |   ford |   analyst | 7566 | 1981-12-03T00:00:00Z | 3000 | null |     20 |
|  7934 | miller |     clerk | 7782 | 1982-01-23T00:00:00Z | 1300 | null |     10 |