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

sql · 浏览次数 : 0

小编点评

**SQL 子查询** SQL 子查询是一种嵌套查询语句,用于在查询过程中执行子查询。子查询可以分为标量子查询、行子查询、列子查询和表子查询等类型。 **子查询类型** * **标量子查询**:子查询返回的是单个值。 * **行子查询**:子查询返回的是一行数据。 * **列子查询**:子查询返回的是一列数据。 * **表子查询**:子查询返回的是一个表的结果。 **子查询执行过程** 子查询的执行过程遵循“由里及外”的原则,总是先执行最内层的子查询语句,然后将结果与外层查询的表进行合并,依次向外扩展并最终形成完整的 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);

以上,本期全部内容。

感谢阅读。

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

与什么是SQL 语句中相关子查询与非相关子查询相似的内容:

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

要理解相关子查询和非相关子查询,我们得首先理解什么是子查询,子查询是指在一个查询语句中嵌套的另一个查询语句。

使用MySQL存储过程提高数据库效率和可维护性

MySQL 存储过程是一种强大的数据库功能,它允许你在数据库中存储和执行一组SQL语句,类似于编程中的函数。存储过程可以大幅提高数据库的性能、安全性和可维护性。本文将详细介绍MySQL存储过程的使用。 什么是MySQL存储过程? MySQL存储过程是一组预编译的SQL语句,它们以一个名称存储在数据库

[转帖]充分利用 Oracle SQL监控

https://zhuanlan.zhihu.com/p/397834311 经常被问到查看执行计划的最佳工具是什么,对我来说,答案总是SQL Monitor(包含在 Oracle Tuning Pack 中)。如果您需要确定在执行任何长时间运行的 SQL 语句期间发生了什么,它确实是最宝贵的工具。

[转帖]MySQL 慢查询日志深入理解

https://www.jb51.net/article/210312.htm + 目录 什么是慢查询日志 MySQL的慢查询日志是 MySQL提供的一种日志记录,它用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过long_query_time 值的 SQL,则会被记录到慢查询日

常见的 NoSQL 数据库有哪些?

前言 今天我们来介绍一下工作开发中常见的一些NoSQL数据库及其基本特点。欢迎在评论区留下文章中没有介绍且好用的​NOSQL数据库🤞。 什么是NOSQL数据库 非关系型数据库又被称为 NoSQL(Not Only SQL ),意为不仅仅是 SQL。指的是与传统关系型数据库(RDBMS)相对应的一类

慢 SQL 优化之索引的作用是什么?

本文针对 MySQL 数据库的 InnoDB 存储引擎,介绍其中索引的实现以及索引在慢 SQL 优化中的作用。本文主要讨论不同场景下索引生效与失效的原因。

[转帖]tgz 安装clickhouse

一、什么是clickhouse ClickHouse是开源的列式存储数据库(DBMS),主要用于在线处理查询(OLAP),能够使用SQL查询实时生成数据分析报告。 下面介绍下安装clickhouse。 二、安装前的准备1、Centos取消打开文件数限制在/etc/security/limits.co

慢SQL的致胜法宝

大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什么思路去解决是我们必须要知道的。本文主要介绍对于慢SQL的排查、解决思路,通过一个个实际的例子深入分析总结,以便更快更准确

[BUUCTF][WEB][极客大挑战 2019]BabySQL 1

靶机打开url 界面上显示,它做了更严格的过滤。看来后台是加了什么过滤逻辑 老规矩先尝试时候有sql注入的可能,密码框输入 123' 爆出sql错误信息,说明有注入点 构造万能密码注入 123' or 1=1 # 居然爆出sql错误, ...version for the right syntax

MYSQL-INNODB索引构成详解

作者:郑啟龙 摘要: 对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是 B+树结构,可以加速SQL查询。但对于B+树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从MYSQL行记录开始说起,层层递进,包括数据页,B+树聚簇索引,B