Skip to content

sql-any-all-operator

SQL 中的 ANY 和 ALL 运算符与比较运算符(=、>、< 等)一起使用,用于将单个值与子查询返回的一组值进行比较。尽管它们是 SQL 标准的一部分,但在现代实践中较不常见,但理解它们有助于更深入地理解 SQL 的表达能力。

核心思想:

  • > ANY (set) 意味着 > MIN(set)(大于集合中的至少一个值)。
  • > ALL (set) 意味着 > MAX(set)(大于集合中的所有值)。
  • < ANY (set) 意味着 < MAX(set)(小于集合中的至少一个值)。
  • < ALL (set) 意味着 < MIN(set)(小于集合中的所有值)。
  • = ANY (set) 等同于 IN (set)。
  • <> ALL (set) 等同于 NOT IN (set)。

让我们为示例使用一个 products 表:

CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
category VARCHAR(50),
price DECIMAL(10, 2)
);
INSERT INTO products VALUES
(1, 'Laptop', 'Electronics', 1200.00),
(2, 'Mouse', 'Electronics', 25.00),
(3, 'T-Shirt', 'Apparel', 20.00),
(4, 'Jeans', 'Apparel', 75.00),
(5, 'Coffee Maker', 'Home Goods', 100.00);

ANY 运算符在比较结果为子查询返回的至少一个值为 TRUE 时返回 TRUE。

示例:查找价格高于任意服装商品的产品

Section titled “示例:查找价格高于任意服装商品的产品”

我们想找出价格比最便宜的服装商品还贵的产品。子查询将返回所有服装商品的价格(20.00,75.00)。条件 price > ANY (...) 对于任何价格大于 20.00 的产品都将为真。

SELECT name, price
FROM products
WHERE price > ANY (SELECT price FROM products WHERE category = 'Apparel');

这在逻辑上等同于 WHERE price > (SELECT MIN(price) FROM products WHERE category = 'Apparel')。

nameprice
Laptop1200.00
Mouse25.00
Jeans75.00
Coffee Maker100.00

将 ANY 与 = 结合使用(等同于 IN)

Section titled “将 ANY 与 = 结合使用(等同于 IN)”

表达式 = ANY 是更常用的 IN 运算符的同义词。

-- 查找价格与任何服装商品价格匹配的产品。
SELECT name, price FROM products
WHERE price = ANY (SELECT price FROM products WHERE category = 'Apparel');
-- 这等同于:
SELECT name, price FROM products
WHERE price IN (20.00, 75.00);

ALL 运算符在比较结果为子查询返回的所有值为 TRUE 时返回 TRUE。

示例:查找价格高于所有服装商品的产品

Section titled “示例:查找价格高于所有服装商品的产品”

现在,我们想找出价格比最贵的服装商品还贵的产品。条件 price > ALL (...) 只对价格大于 75.00 的产品为真。

SELECT name, price
FROM products
WHERE price > ALL (SELECT price FROM products WHERE category = 'Apparel');

这在逻辑上等同于 WHERE price > (SELECT MAX(price) FROM products WHERE category = 'Apparel')。

nameprice
Laptop1200.00
Coffee Maker100.00

尽管 ANY 和 ALL 在功能上是正确的,但现代 SQL 开发人员通常更喜欢更明确、更易读的替代方案。

ANY/ALL 表达式更常用和可读的替代方案
col = ANY (subquery)col IN (subquery)
col <> ANY (subquery)NOT (col = ALL (subquery))(无直接简单替代方案)
col <> ALL (subquery)col NOT IN (subquery)
col > ANY (subquery)col > (SELECT MIN(...) FROM ...)
col > ALL (subquery)col > (SELECT MAX(...) FROM ...)

使用 IN、NOT IN、EXISTS 或带有聚合函数(MIN、MAX、AVG)的子查询通常能让其他开发人员更清楚地理解查询意图。然而,理解 ANY 和 ALL 对于阅读旧代码或在它们可能提供更简洁解决方案的复杂场景中都是有益的。