子查询
基础表结构
1 | -- 部门表 |
一、按位置分类示例
1. WHERE 子查询(标量子查询)
1 | -- 查询工资高于平均工资的员工 |
1 | name | salary |
2. FROM 子查询(派生表)
1 | -- 查询各部门平均工资 |
1 | dept_id | avg_salary |
3. SELECT 子查询(标量子查询)
1 | -- 显示员工工资与公司平均工资的差值 |
1 | name | salary | diff |
二、按返回结果分类示例
1. 行子查询(单行多列)
1 | -- 查找与张三部门和工资都相同的人 |
1 | name |
2. 列子查询(单列多行)
1 | -- 查找研发部和销售部的员工 |
1 | name |
3. 表子查询(多行多列)
1 | -- 查询高工资员工(>10000)及其部门 |
1 | name | dept_name |
三、按相关性分类示例
1. 非关联子查询
1 | -- 查询比最高工资少的员工 |
``
1 | name |
2. 关联子查询
1 | -- 查询工资高于部门平均工资的员工 |
1 | name | dept_id | salary |
四、特殊类型示例
1. EXISTS 子查询
1 | -- 查询有员工的部门 |
1 | name |
2. CTE (WITH 子句) - MySQL 8.0+
1 | -- 使用CTE查询高工资员工 |
1 | name | salary |
五、优化示例(JOIN替代IN)
1 | -- 原始IN子查询 |
关键提示:
- 标量子查询必须返回单值
- 派生表必须使用别名
- EXISTS 更高效检查存在性
- MySQL 8.0+ 优先使用CTE提高可读性
- 大数据量时用JOIN替代IN子查询
总结:MySQL 子查询形式速查表
| 分类维度 | 类型 | 常用操作符/写法 | 典型场景 |
|---|---|---|---|
| 位置 | WHERE 子查询 | >, IN, EXISTS |
条件过滤 |
| FROM 子查询 | 派生表 + 别名 | 多步骤数据处理 | |
| SELECT 子查询 | 标量子查询 | 添加计算列 | |
| 返回结果 | 标量子查询 | 比较运算符 | 单值比较(如平均工资) |
| 行子查询 | (col1, col2) = (...) |
多列组合匹配 | |
| 列子查询 | IN, ANY/SOME, ALL |
多值匹配(如部门ID列表) | |
| 表子查询 | 派生表 | 作为临时数据源 | |
| 相关性 | 非关联子查询 | 独立执行 | 静态条件过滤 |
| 关联子查询 | 外层列引用 (e1.col=e2.col) |
分组内比较(如部门内工资) | |
| 特殊类型 | EXISTS/NOT EXISTS |
布尔判断 | 存在性检查(如是否有订单) |
CTE (WITH 子句) |
MySQL 8.0+ | 复杂查询模块化 |