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);

以上,本期全部内容。

感谢阅读。

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

什么是SQL 语句中相关子查询与非相关子查询的更多相关文章

  1. COMMENT方法 用于在生成的SQL语句中添加注释内容,

    COMMENT方法 用于在生成的SQL语句中添加注释内容,例如: $this->comment('查询考试前十名分数') ->field('username,score') ->li ...

  2. Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”

    Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛卡尔积,然后在在里面查询符合的 ...

  3. SQL Server参数化SQL语句中的like和in查询的语法(C#)

    sql语句进行 like和in 参数化,按照正常的方式是无法实现的 我们一般的思维是: Like参数化查询:string sqlstmt = "select * from users whe ...

  4. SQL语句中的单引号处理以及模糊查询

    为了防止程序SQL语句错误以及SQL注入,单引号必须经过处理.有2种办法: 1.使用参数,比如SELECT * FROM yourTable WHERE name = @name; 在C#中使用Sql ...

  5. SQL--相关子查询 与 非相关子查询

    SQL 子查询可以分为相关子查询 与 非相关子查询. 假设Books表如下: 类编号 图书名 出版社 价格 ---------------------------------------------- ...

  6. SQL语句中的select高级用法

    #转载请联系 为了更好的了解下面的知识点,我们先创建两张表并插入数据. # 学生表 +----+-----------+------+--------+--------+--------+------ ...

  7. 解析sql语句中left_join、inner_join中的on与where的区别

    以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下 table a(id, type):id     type ---- ...

  8. (转)select 1 from ... sql语句中的1代表什么意思? .

    select  1 from ..., sql语句中的1代表什么意思?查出来是个什么结果?         select 1 from table;与select anycol(目的表集合中的任意一行 ...

  9. SQL语句中output的用法

    在SQL语句中,output可以作为返回值来使用, 1.我们先看这个存储过程 代码: 1 set ANSI_NULLS ON  2 set QUOTED_IDENTIFIER ON  3 go  4 ...

  10. (转载)SQL语句中Group by语句的详细介绍

    转自:http://blog.163.com/yuer_d/blog/static/76761152201010203719835 SQL语句中Group by语句的详细介绍              ...

随机推荐

  1. OpenCvSharp inputs[0].size[1] % blobs[0].size[1] == 0

    报错代码如图 详细错误 未处理 OpenCvSharp.OpenCVException HResult=-2146233088 Message=inputs[0].size[1] % blobs[0] ...

  2. Windows和Linux系统下的Conda环境迁移

    Motivation ​ 大家在学习Python的过程中,可能经常会遇到下面两种情况: 同一份代码,别人配置conda环境可以跑通,但你配置了N天,还不知道哪一步出现了差错,仍然跑不通代码,conda ...

  3. #费马小定理#JZOJ 4015 数列

    题目 给出\(x_n=(ax_{n-1}^2+bx_{n-1}+c)\bmod m\) 给出\(x_0.a,b,c,n,m\),求\(x_n\) \(\text{Subtask 1:}n\leq 10 ...

  4. JDK11的新特性:新的HTTP API

    目录 简介 使用HTTP Client请求的基本流程 创建HTTP Client 创建HTTP Request 发送HTTP请求 异步HTTP请求 总结 JDK11的新特性:新的HTTP API 简介 ...

  5. Redis 02 基础命令

    数据库 Redis 默认有 16 个数据库. 默认使用的是第 0 个数据库. 不同数据库存不同的值. 切换数据库 select 127.0.0.1:6379> select 1 OK 127.0 ...

  6. openGauss2.1.0新特性-账本数据库实验

    openGauss2.1.0 新特性-账本数据库实验 账本数据库融合了区块链思想,将用户操作记录至两种历史表中:用户历史表和全局区块表.当用户创建防篡改用户表时,系统将自动为该表添加一个 hash 列 ...

  7. HarmonyOS分布式文件系统开发指导

      分布式文件系统概述 分布式文件系统(hmdfs,HarmonyOS Distributed File System)提供跨设备的文件访问能力,适用于如下场景: ● 两台设备组网,用户可以利用一台设 ...

  8. scala json解析到case类

    有时候,需要将从json文件读取程序配置设置,并同步到定义好的一些case类中,这个时候可以使用 io.circe解析json文件,并同步文件字段到定义好的case类 case class Confi ...

  9. triple loss

    Triplet Loss是深度学习中的一种损失函数,用于训练差异性较小的样本,如人脸等, Feed数据包括锚(Anchor)示例.正(Positive)示例.负(Negative)示例,通过优化锚示例 ...

  10. mysql 必知必会整理—视图[十二]

    前言 简单整理一下视图. 正文 视图: 需要MySQL 5 MySQL 5添加了对视图的支持.因此,本章内容适用于MySQL 5及以后的版本. 视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动 ...