1. 子查询基础概念解析
子查询(Subquery)是MySQL中一个强大且常用的功能特性,它允许我们在一个SQL语句内部嵌套另一个完整的SELECT查询语句。这种"查询中的查询"结构在实际开发中极为常见,特别是在需要基于中间结果进行进一步筛选或计算的场景。
1.1 子查询的本质与执行流程
从数据库引擎的视角来看,子查询的执行遵循"由内而外"的原则。当MySQL解析到包含子查询的语句时,会首先执行最内层的子查询,将其结果作为临时数据集(可能是单个值、一列值或一个临时表),然后外层查询再基于这个中间结果继续执行。
这种执行方式带来了几个重要特性:
- 子查询必须包含在括号内,这是MySQL识别子查询的语法标志
- 子查询可以出现在SELECT、FROM、WHERE、HAVING等多个子句中
- 子查询通常会与比较运算符(=, >, IN等)结合使用
1.2 子查询的典型应用场景
在实际业务中,子查询最常见的几种使用模式包括:
- 过滤条件中的子查询:在WHERE子句中使用子查询结果作为过滤条件
sql复制SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);
- 派生表子查询:在FROM子句中使用子查询生成临时表
sql复制SELECT dept_avg.dept_name, dept_avg.avg_salary
FROM (SELECT d.dept_name, AVG(e.salary) as avg_salary
FROM departments d JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_name) AS dept_avg
WHERE dept_avg.avg_salary > 10000;
- 列表达式子查询:在SELECT列表中使用返回单值的子查询
sql复制SELECT e.employee_name,
e.salary,
(SELECT AVG(salary) FROM employees) AS company_avg
FROM employees e;
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 子查询类型深度解析
2.1 标量子查询(Scalar Subquery)
标量子查询是最基础的类型,它只返回单个值(一行一列)。这种子查询可以出现在任何需要单个值的位置,如SELECT列表、WHERE条件或HAVING子句中。
典型用例:查找高于部门平均工资的员工
sql复制SELECT e.employee_id, e.employee_name, e.salary
FROM employees e
WHERE e.sal
