子查询是指把一个查询语句嵌套在另一个查询语句中。它常用于“先查出一组结果,再把这组结果作为另一个查询的条件或数据来源”。
ANY 和 SOME 在 MySQL 中语义相近,表示“满足子查询结果中的任意一个值即可”。
例如:
SELECT *
FROM product
WHERE price > ANY (
SELECT price
FROM product
WHERE category_id = 1
);这表示:只要价格大于子查询结果中的任意一个值,就满足条件。
在实际业务中,ANY / SOME 不如普通 IN、EXISTS 使用频率高,但理解它们有助于掌握更完整的 SQL 语义。
ALL 表示“必须满足子查询结果中的所有值”。
例如:
SELECT *
FROM product
WHERE price > ALL (
SELECT price
FROM product
WHERE category_id = 1
);这表示当前商品价格必须大于分类 1 中的所有商品价格,也就是大于该分类中的最大值。
EXISTS 用于判断子查询是否返回记录。
例如查询“存在订单的用户”:
SELECT *
FROM user AS u
WHERE EXISTS (
SELECT 1
FROM orders AS o
WHERE o.user_id = u.id
);如果子查询能查到记录,则 EXISTS 条件成立。
它适合:
- 判断关联数据是否存在
- 做存在性筛选
- 某些场景下替代
IN
子查询的核心思想是“先查一次,再把结果给外层查询使用”。ANY / SOME 强调任意满足,ALL 强调全部满足,EXISTS 强调是否存在记录。