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吗?我倾向于认为是,但是看不清。
答案 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)
是的,= 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
是的,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 |