any、all、some 用法
astak16 opened this issue · comments
柚子uccs commented
any
、 all
、 some
是子查询关键词之一,必须与一个比较操作符进行一起使用。
any
和子查询返回的列中 任一值 比较为true
则返回为true
。all
和子查询返回的列中 所有值 比较为true
则返回为true
。some
的用法和any
一样,在!=
的场景中,用any
容易产生误解,用some
更容易理解
create table t1 (id int, value int);
create table t2 (id int, value int);
insert into t1 values(1, 10), (2, 300), (3, 40), (4, 60), (5, 70), (6, 80);
insert into t2 values(1, 100), (2, 300), (3, 40), (4, 600), (5, 70), (6, 800);
all
方法
select * from t1 where value <= all(
select value from t2
);
- 子查询查出
t2
表中所有的value
,结果为(100, 300, 40, 600, 70, 800)
t1
表中筛选value <= all(100, 300, 40, 600, 70, 800)
- 第一条数据的
value = 10
,它小于等于(100, 300, 40, 600, 70, 800)
里所有的值,结果为true
- 第二条数据的
value = 300
它没有小于等于(100, 300, 40, 600, 70, 800)
里所有的值,结果为false
- 不断循环下去,直到最后查完所有数据
- 第一条数据的
tips
- 如果子查询中结果为 空,结果为
true
- 如果有一条数据为
null
,结果为false
,也就是说查不出结果 - 如果有所有数据为
null
,结果为false
,和结果为空不是一个概念
any
方法
select * from t1 where value <= any(
select value from t2
);
- 子查询查出
t2
表中所有的value
,结果为(100, 300, 40, 600, 70, 800)
t1
表中筛选value <= (100, 300, 40, 600, 70, 800)
- 第一条数据的
value = 10
,它小于等于(100, 300, 40, 600, 70, 800)
里任一的值,结果为true
- 第二条数据的
value = 300
它没有小于等于(100, 300, 40, 600, 70, 800)
里任一的值,结果为true
- 不断循环下去,直到最后查完所有数据
- 第一条数据的
tips:
- 如果子查询中结果为 空,结果为
false
,也就是说查不出结果 - 如果子查询中所有结果都为
null
,结果为false
some
用法
select * from t1 where value != some(
select value from t2
);
t1
表中有部分 value
与 t2
表中的 value
不相等
如果用 any
就会理解成:t1
表中的 value
与 t2
表中的任意 value
不相等。
他们结果是一样的。