JavaWeb——MySQL-多表查询(4/7)-子查询(标量、列)(子查询定义阐释、类型细分,标量子查询实践、列子查询应用,总结与要点回顾)

目录

子查询概念与分类

子查询定义阐释

子查询类型细分

标量子查询实践

列子查询应用

子查询总结与要点回顾


子查询概念与分类

子查询定义阐释

        子查询指在 SQL 语句中嵌套SELECT查询语句,嵌套部分称嵌套查询或子查询,外部语句可为INSERTUPDATEDELETESELECT,常见于SELECT语句。如

SELECT *
FROM table
WHERE column = (SELECT value FROM another_table);

依另一查询结果确定筛选条件,增强查询灵活性与逻辑性,实现复杂数据筛选需求。

子查询类型细分

  • 标量子查询:返回单个值,可为数字、字符串或日期类型,是最简单子查询形式,常用比较运算符(如=<>>>=<<=)与外部查询条件关联。
  • 列子查询:返回一列数据,含多行,常用INNOT IN等运算符与外部查询条件匹配,实现基于多值集合的筛选。
  • 行子查询:返回一行数据,含多列,用于需整行数据作条件的场景,如与外部查询表特定行匹配。
  • 表子查询:返回多行多列数据,相当于子查询结果为新表,用于复杂关联查询或需子查询结果集参与进一步运算场景。

标量子查询实践

需求实现:查询教研部所有员工(标量子查询)

  • 查询思路剖析

        员工表(EMP)无部门名称字段,仅部门 ID,已知部门名称为 “教研部”,需先查教研部部门 ID,再依 ID 查员工信息。此思路将复杂查询分解为两步,降低难度,体现子查询分步解决问题优势。

  • 分步查询构建
    • 查询部门 ID:从部门表(dept)查教研部部门 ID,
      SELECT id FROM tb_dept WHERE name = '教研部';
      ,执行获教研部 ID(如 2)。
    • 查询员工信息:基于员工表,用
      SELECT * FROM tb_emp WHERE dept_id = 2;
      查部门 ID 为 2(教研部)的员工信息,获教研部员工记录。
  • 子查询合并优化

        将第一步查询的部门 ID(2)替换为查询语句

SELECT id FROM tb_dept WHERE name = '教研部';

,合并为

SELECT *
FROM tb_emp
WHERE dept_id = (SELECT id FROM tb_dept WHERE name = '教研部');

,执行结果同分步查询,展示子查询整合数据检索能力,减少数据交互次数,提升效率。

需求实现:查询方东白入职之后入职的员工信息(标量子查询)

  • 查询步骤规划

        先查方东白入职时间,再查入职时间晚于方东白的员工信息,最后合并查询语句。此规划清晰明确,符合逻辑,为复杂查询提供有序解决路径。

  • 分步查询实施
    • 查询入职时间:从员工表依姓名条件查方东白入职时间,
      SELECT entrydate FROM tb_emp WHERE name = '方东白';
      ,执行得入职时间(如 '2012 - 11 - 01')。
    • 查询员工信息:基于员工表,用
      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,
      SELECT id FROM tb_dept WHERE name = '教研部' OR name = '咨询部';
      ,执行得部门 ID 集合(如 2 和 3)。
    • 查询员工信息:基于员工表,用
      SELECT * FROM tb_emp WHERE dept_id IN (2, 3);
      查部门 ID 在集合(2 和 3)中的员工信息,获教研部与咨询部员工记录。
  • 子查询合并与结果呈现

        将第一步查询的部门 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课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值