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)Not IN怎么样?它等于<> ALL吗?我倾向于认为它是,但不能清楚地看到它。
你是对的IN
相当于= ANY
。在这个主题上,SQL:2016标准(ISO 9075-2:2016)说:
8.4 <在谓词中>
[..]
Syntax Rules
[..]
4)表达
RVC NOT IN IPV
相当于
NOT ( RVC IN IPV )
5)表达
RVC IN IPV
相当于
RVC = ANY IPV
IN
的等价在第5点,而第4点在某种程度上回答了你关于NOT IN
的问题。
= ANY
总是等于IN
。
ANY在值上使用OR
chosen = ANY('True', 'Yes')
扩展时:
chosen = 'True' OR chosen = 'Yes'
与:
chosen IN ('True', 'Yes')
扩展时:
chosen = 'True' OR chosen = 'Yes'
ANY
/ IN
都使用ORNOT 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答案,可以让我解释“点击”。
在quora上找到了answer。
注意,伪代码提前。查询不会开箱即用。为了使查询真正起作用,将列表封装为“Any”/“All”可以操作的内容,例如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
“全部”:相当于“和”条件。因此,在下面的例子中,考虑工资> 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 |
我假设您的数据库支持ANY
运算符(其他一些数据库不支持它)。使用ANY
和=
后跟子查询在逻辑上等同于使用IN
,然后使用相同的子查询。但不同的是,ANY
也支持其他比较运算符>
,>=
,<
和<=
。
比较<> ALL
说子查询中的每个记录都不等于LHS上的值。否定这一点是在子查询中存在一个或多个与LHS相等的记录。因此,与<> ALL
相反的只是IN
。