postgresql----ANY/SOME&&ALL
一.ANY/SOME
WHERE expression operator ANY (subquery)
WHERE expression operator SOME (subquery)
其实ANY和SOME在这里是同等效的,子查询的结果集只能是一个字段,左边表达式使用operator对结果集的每一行进行一次比较运算,如果有一个运算结果是'TRUE',则表达式结果为'TRUE',如果比较结果全部是'FALSE'表达式结果才是'FALSE'。
> ANY 大于子查询结果中的某个值
< ANY 小于子查询结果中的某个值
>= ANY 大于或等于子查询结果中的某个值
<= ANY 小于或等于子查询结果中的某个值
= ANY 等于子查询结果中的某个值,相当于IN
!= ANY 不等于子查询结果中的某个值
示例1.查询tbl_insert表,条件是字段a大于表tbl_test字段f某一行中的值
test=# select * from tbl_insert where a > any(select f from tbl_test); a | b | c ---+---+------- 2 | 2 | 22 3 | 3 | 33 4 | 4 | 44 5 | 5 | 51 6 | 6 | 1 6 | 6 | 61 6 | 6 | 661 7 | 7 | 3%1 8 | 8 | 3%_1 8 | 8 | 3_%_1 7 | 7 | abc 7 | 7 | ABc 7 | 7 | aBC (13 rows)
二.ALL
WHERE expression operator ALL(subquery)
同样子查询中仍只能返回一个字段,与子查询结果集每一行进行比较结果全部是'TRUE'表达式结果才是'TRUE',否则为'FALSE'。
> ALL 大于子查询结果中的所有值
< ALL 小于子查询结果中的所有值
>= ALL 大于或等于子查询结果中的所有值
<= ALL 小于或等于子查询结果中的所有值
= ALL 等于子查询结果中所有值(除非子查询的结果全部相等,所以实际上没什么意义)
!= ALL 不等于子查询结果中的任何一个值,相当于NOT IN
示例1.查询tbl_insert表中a最大的行
test=# select * from tbl_insert where a = (select max(a) from tbl_insert); a | b | c ---+---+------- 8 | 8 | 3%_1 8 | 8 | 3_%_1 (2 rows) test=# select * from tbl_insert where a >= all(select a from tbl_insert); a | b | c ---+---+------- 8 | 8 | 3%_1 8 | 8 | 3_%_1 (2 rows)
示例2.查询tbl_insert表中a最小的行
test=# select * from tbl_insert where a <= all(select a from tbl_insert); a | b | c ---+---+---- 1 | 1 | 11 (1 row) test=# select * from tbl_insert where a = (select min(a) from tbl_insert); a | b | c ---+---+---- 1 | 1 | 11 (1 row)