子查询 === 子查询是指把一个查询语句嵌套在另一个查询语句中。它常用于“先查出一组结果,再把这组结果作为另一个查询的条件或数据来源”。 ### 带ANY、SOME关键字的子查询 `ANY` 和 `SOME` 在 MySQL 中语义相近,表示“满足子查询结果中的任意一个值即可”。 例如: ```sql SELECT * FROM product WHERE price > ANY ( SELECT price FROM product WHERE category_id = 1 ); ``` 这表示:只要价格大于子查询结果中的任意一个值,就满足条件。 在实际业务中,`ANY` / `SOME` 不如普通 `IN`、`EXISTS` 使用频率高,但理解它们有助于掌握更完整的 SQL 语义。 ### 带ALL关键字的子查询 `ALL` 表示“必须满足子查询结果中的所有值”。 例如: ```sql SELECT * FROM product WHERE price > ALL ( SELECT price FROM product WHERE category_id = 1 ); ``` 这表示当前商品价格必须大于分类 1 中的所有商品价格,也就是大于该分类中的最大值。 ### 带EXISTS关键字的子查询 `EXISTS` 用于判断子查询是否返回记录。 例如查询“存在订单的用户”: ```sql 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` 强调是否存在记录。