目录
子查询概念与分类
子查询定义阐释
子查询指在 SQL 语句中嵌套SELECT
查询语句,嵌套部分称嵌套查询或子查询,外部语句可为INSERT
、UPDATE
、DELETE
或SELECT
,常见于SELECT
语句。如
SELECT *
FROM table
WHERE column = (SELECT value FROM another_table);
依另一查询结果确定筛选条件,增强查询灵活性与逻辑性,实现复杂数据筛选需求。
子查询类型细分
- 标量子查询:返回单个值,可为数字、字符串或日期类型,是最简单子查询形式,常用比较运算符(如
=
、<>
、>
、>=
、<
、<=
)与外部查询条件关联。 - 列子查询:返回一列数据,含多行,常用
IN
或NOT IN
等运算符与外部查询条件匹配,实现基于多值集合的筛选。 - 行子查询:返回一行数据,含多列,用于需整行数据作条件的场景,如与外部查询表特定行匹配。
- 表子查询:返回多行多列数据,相当于子查询结果为新表,用于复杂关联查询或需子查询结果集参与进一步运算场景。
标量子查询实践
需求实现:查询教研部所有员工(标量子查询)
- 查询思路剖析
员工表(EMP
)无部门名称字段,仅部门 ID,已知部门名称为 “教研部”,需先查教研部部门 ID,再依 ID 查员工信息。此思路将复杂查询分解为两步,降低难度,体现子查询分步解决问题优势。
- 分步查询构建
- 查询部门 ID:从部门表(dept)查教研部部门 ID,
,执行获教研部 ID(如 2)。SELECT id FROM tb_dept WHERE name = '教研部';
- 查询员工信息:基于员工表,用
查部门 ID 为 2(教研部)的员工信息,获教研部员工记录。SELECT * FROM tb_emp WHERE dept_id = 2;
- 查询部门 ID:从部门表(dept)查教研部部门 ID,
- 子查询合并优化
将第一步查询的部门 ID(2)替换为查询语句
SELECT id FROM tb_dept WHERE name = '教研部';
,合并为
SELECT *
FROM tb_emp
WHERE dept_id = (SELECT id FROM tb_dept WHERE name = '教研部');
,执行结果同分步查询,展示子查询整合数据检索能力,减少数据交互次数,提升效率。
需求实现:查询方东白入职之后入职的员工信息(标量子查询)
- 查询步骤规划
先查方东白入职时间,再查入职时间晚于方东白的员工信息,最后合并查询语句。此规划清晰明确,符合逻辑,为复杂查询提供有序解决路径。
- 分步查询实施
- 查询入职时间:从员工表依姓名条件查方东白入职时间,
,执行得入职时间(如 '2012 - 11 - 01')。SELECT entrydate FROM tb_emp WHERE name = '方东白';
- 查询员工信息:基于员工表,用
查入职时间晚于方东白的员工信息,获符合条件员工记录。SELECT * FROM tb_emp WHERE entrydate > '2012-11-01';
- 查询入职时间:从员工表依姓名条件查方东白入职时间,
- 子查询整合与结果验证:将第一步查询的入职时间替换为查询语句
,合并为SELECT entrydate FROM tb_emp WHERE name = '方东白';
,执行结果与分步查询一致,再次证明子查询合并优化可行性,为精准数据检索提供高效手段。SELECT * FROM tb_emp WHERE entrydate > (SELECT entrydate FROM tb_emp WHERE name = '方东白');
列子查询应用
需求实现:查询教研部及咨询部所有员工信息(列子查询)
- 查询策略分析
员工表无部门名称字段,需先查教研部与咨询部部门 ID,再依 ID 查员工信息。此策略将问题分解,利用子查询先获取关键 ID 值,为后续查询提供基础。
- 分步查询执行
- 查询部门 ID:从部门表查教研部与咨询部部门 ID,
,执行得部门 ID 集合(如 2 和 3)。SELECT id FROM tb_dept WHERE name = '教研部' OR name = '咨询部';
- 查询员工信息:基于员工表,用
查部门 ID 在集合(2 和 3)中的员工信息,获教研部与咨询部员工记录。SELECT * FROM tb_emp WHERE dept_id IN (2, 3);
- 查询部门 ID:从部门表查教研部与咨询部部门 ID,
- 子查询合并与结果呈现
将第一步查询的部门 ID 集合(2 和 3)替换为查询语句
SELECT id FROM tb_dept WHERE name = '教研部' OR name = '咨询部';
,合并为
SELECT *
FROM tb_emp
WHERE dept_id IN (SELECT id FROM tb_dept WHERE name = '教研部' OR name = '咨询部');
,执行结果与分步查询一致,展示列子查询在多值匹配场景的应用,依部门名称集合精准筛选员工信息,提升数据查询灵活性与精确性。
子查询总结与要点回顾
- 子查询功能价值总结
子查询为 SQL 查询增添强大灵活性与逻辑表达力,通过嵌套实现复杂条件构建与数据筛选,可依不同业务需求返回不同类型结果(标量、列、行、表),为数据检索提供丰富手段,适应多变业务场景与数据处理需求。
- 查询构建与优化思路
解决复杂查询问题时,可将其分解为多个简单子查询分步处理,降低难度、提高可读性与维护性,最后依逻辑关系合并子查询构建完整查询语句,优化数据检索过程,提升查询效率与准确性。
- 运算符与条件匹配注意
不同类型子查询适用运算符不同,标量子查询用比较运算符,列子查询常用IN
等集合运算符,行子查询与特定行匹配条件,编写时需依子查询类型与业务逻辑选正确运算符,确保条件准确匹配,保证查询结果符合预期,避免因运算符不当导致数据错误或遗漏。
END
学习自:黑马程序员——JavaWeb课程