ANY 与 ALL 是什么
比较运算符配合 ANY/SOME/ALL 表达「与任意一个值比较」或「与所有值比较」:= ANY 等价于 IN,<> ALL 等价于 NOT IN,NULL 的处理规则也一样。PostgreSQL 还支持把数组写在括号里,例如 id = ANY(ARRAY[1,2,3]),写参数化查询时更灵活。
基本信息
| = ANY | 等价 IN |
|---|---|
| <> ALL | 等价 NOT IN,同样有 NULL 陷阱 |
| SOME | 与 ANY 完全同义 |
| PostgreSQL 扩展 | 支持数组:id = ANY(ARRAY[1,2,3]) |
| MySQL | ANY/SOME/ALL 用于子查询比较 |
典型使用场景
- 表达「大于任何一个」或「大于全部」这类语义
- 用 = ANY 替代 IN 写参数化查询
- PostgreSQL 里用数组直接传一批 ID
- 排查 NOT IN 结果为空的原因
- 写「比所有同类商品都贵」这类读起来就清楚的查询
示例
示例
-- 比 A 类商品都贵:与所有值比较
SELECT * FROM products
WHERE price > ALL (SELECT price FROM products WHERE category = 'A');
-- 与 IN 等价:命中任意一个即可
SELECT * FROM users
WHERE id = ANY (SELECT user_id FROM orders WHERE amount > 1000);
-- PostgreSQL:括号里可以直接写数组
SELECT * FROM users WHERE id = ANY (ARRAY[1, 2, 3]);对照与 NULL 行为
| 写法 | 等价关系 | NULL 参与时的行为 |
|---|---|---|
| = ANY (子查询) | 等价 IN | 子查询含 NULL 不影响命中,只有一侧为 NULL 时不匹配 |
| <> ALL (子查询) | 等价 NOT IN | 子查询含 NULL 会让结果整段为空 |
| > ANY | 至少大于一个值 | 等价于与子查询的最小值比较 |
| > ALL | 大于所有值 | 等价于与子查询的最大值比较 |
| = ANY (数组) | PostgreSQL 扩展 | 按逐元素比较处理 |
子查询为空时两种写法的结果相反:比较运算符配 ANY 返回假(没有可匹配的行),配 ALL 返回真(不存在反例)。边界数据上很容易得出与预期相反的结论。
PostgreSQL 的 ANY 有两种形态:括号里是数组字面量时按数组处理,是子查询时按子查询处理,迁移改写时不要混着写。
PostgreSQL 里把一批 ID 作为数组参数传入很常见:比拼接 IN 列表更安全,也不受参数个数上限的困扰,配合 = ANY 写起来更简洁。
同一查询里同时出现 ANY 与 ALL 时,先确认业务要表达的是「至少满足一个」还是「全部满足」:两者在空集与含 NULL 时的边界行为完全相反。