• 什么是SQL 语句中相关子查询与非相关子查询


     

    1.什么是SQL子查询

    要理解相关子查询和非相关子查询,我们得首先理解什么是子查询,子查询是指在一个查询语句中嵌套的另一个查询语句。 子查询可以嵌套在其他查询语句中,如 SELECTINSERTUPDATEDELETE 等,它作为一个独立的查询单元,其结果可以被外部查询所使用。 子查询可以帮助我们更灵活地处理数据和执行复杂的查询操作。

    2.sql子查询分类

    子查询主要有以下几类:

    1. 标量子查询:子查询返回的是单个值,如一个数字、字符串等。
    2. 行子查询:子查询返回的是一行数据。
    3. 列子查询:子查询返回的是一列数据。
    4. 表子查询:子查询返回的是一个表的结果。

    3.子查询执行过程解析

    子查询的执行过程遵循“由里及外”的原则,总是先执行最内层的子查询语句,执行完毕后将执行结果与外层的语句进行合并,依次逐层向外扩展并最终形成完整的 SQL 语句。

    具体来说,子查询的执行过程可以分为以下几种情况:

    1. 子查询作为 WHERE 子句的一部分:首先执行子查询,得到结果集。然后,将结果集与外层查询的表进行比较,只有符合条件的行才会被返回。
    2. 子查询作为 HAVING 子句的一部分:先对 GROUP BY 子句指定的列进行分组,然后执行子查询。子查询的结果集将作为条件与分组后的每个组进行比较,只有符合条件的组才会被返回。
    3. 子查询作为 SELECT 子句的一部分:执行子查询,得到结果集。然后,将结果集作为列值添加到外层查询的结果集中。

    需要注意的是,在实际应用中,子查询的执行顺序可能会受到数据库系统的优化和查询计划的影响,但总体上仍然遵循“由里及外”的原则。同时,为了提高查询效率,在编写子查询时,需要注意子查询的可读性和可维护性,避免过度嵌套和复杂的查询逻辑。

    4.什么是SQL 语句中相关子查询与非相关子查询

    3.1释义

    非相关子查询

    • 子查询可以独立于外部查询进行执行和评估。
    • 子查询在外部查询执行之前被执行一次。
    • 子查询的结果不依赖于外部查询的具体行数据。

    相关子查询

    • 子查询的执行与外部查询的每一行相关联。
    • 子查询需要根据外部查询的每一行数据进行多次评估。
    • 子查询中通常会引用外部查询中的某些列。

    3.2区别

    相关子查询和非相关子查询主要有以下区别:

    非相关子查询

    1. 独立执行:子查询可以单独执行,不依赖于外部查询。
    2. 执行一次:子查询在外部查询处理之前执行一次。

    相关子查询

    1. 依赖外部查询:子查询的执行与外部查询的每一行相关联。
    2. 多次执行:子查询会针对外部查询的每一行都执行一次。

    3.3判断

    可以通过以下几个方面来判断一个查询是相关子查询还是非相关子查询:

    1. 子查询是否依赖外部查询的结果:相关子查询的执行需要依赖外部查询的每一行数据,而非相关子查询则不依赖。
    2. 执行顺序:非相关子查询通常先执行子查询,然后再执行外部查询;相关子查询则与外部查询的执行过程交织在一起,子查询会针对外部查询的每一行多次执行。
    3. 子查询中是否引用外部查询的列:相关子查询中通常会引用外部查询的列,而非相关子查询一般不会。

    3.4示例

    以下是相关子查询和非相关子查询的例子:

    非相关子查询:

    1. 获取所有员工中工资大于平均工资的员工信息:
    SELECT * FROM employees
    WHERE salary > (SELECT AVG(salary) FROM employees);
    

    相关子查询:

    1. 获取每个部门中工资最高的员工信息:
    SELECT * FROM employees e1
    WHERE salary = (SELECT MAX(salary) FROM employees e2 WHERE e2.department_id = e1.department_id);
    

    以上,本期全部内容。

    感谢阅读。

    按例,欢迎点击此处关注我的个人公众号,交流更多知识。

  • 相关阅读:
    租赁系统开发|沈阳租赁系统|免押房屋租赁功能展示
    第6讲:SQL语句之DQL类型的数据查询语言
    重审新消费品牌的长远发展
    算能RISC-V通用云编译飞桨paddlepaddle@openKylin留档
    电机控制——高数基础
    十九章总结 Java绘图
    并查集快速合并(Java 实例代码)
    exe文件用服务的方式启动(避免启动弹窗)
    移动通信覆盖自愈的研究与实现
    Qt扫盲- QTextStream 理论总结
  • 原文地址:https://www.cnblogs.com/lubians/p/18164001