首页 > 数据库 >什么是SQL 语句中相关子查询与非相关子查询

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

时间:2024-04-28 16:46:49浏览次数:28  
标签:语句 外部 查询 SQL 相关 执行 SELECT

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,相关,执行,SELECT
From: https://www.cnblogs.com/lubians/p/18164001

相关文章

  • day26-python操作MySQL和实战
    1.事务innodb引擎中支持事务,myisam不支持。CREATETABLE`users`(`id`int(11)NOTNULLAUTO_INCREMENTPRIMARYKEY,`name`varchar(32)DEFAULTNULL,`amount`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8;例如:李杰给武沛齐转账100,那就会......
  • 无需重新学习,使用 Kibana 查询/可视化 SLS 数据
    作者:荆磊场景现在通过SLS的ES兼容能力,可以很方便地实现用Kibana来查询和可视化SLS的数据。对于从ES迁移到SLS的用户可以继续保留原来的Kibana使用习惯。下面来演示如何通过Kibana来访问SLS。使用方法部署架构这里蓝色部分是需要客户端部署的组件。Kibana......
  • sqlserver sp_who2和inputbuffer的使用,如何查询进程执行的脚本代码【转】
    一、sp_who2的使用1、存储过程的位置 sp_who官方解释地址:https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-who-transact-sql?redirectedfrom=MSDN&view=sql-server-2017 2、查出的列名的含义CPUTime: 进程占用的......
  • mongodb异机做时间点恢复(基于时间范围查询导出oplog)
    环境:OS:Centos7DB:mongodb5原环境:1主2从,异机恢复的环境:单机(oplog.rs是否开启都可以,开启可以参考:https://www.cnblogs.com/hxlasky/p/17979922) 1.模拟写入数据连接主库模拟写入数据/usr/local/services/mongodb/bin/mongo192.168.56.101:29001useadmindb.auth("......
  • mysqlalchemy audit extension
    mysqlalchemyauditextensionhttps://sqlalchemy-declarative-extensions.readthedocs.io/en/stable/audit_tables.htmlfromsqlalchemyimportColumn,typesfromsqlalchemy.ormimportdeclarative_basefromsqlalchemy_declarative_extensionsimportdeclarative_......
  • mysql触发器记录log
    记录指定参数变化https://zhuanlan.zhihu.com/p/439273702DELIMITER//CREATETRIGGERlog_sales_updatesAFTERUPDATEONsalesFOREACHROWInsertintoaudit_log(sales_id,previous_amount,new_amount,updated_by,updated_on)VALUES(NEW.sales_id,OLD.sales_amoun......
  • MySQL三大日志(binlog,redolog,undolog)详解
    转发https://segmentfault.com/a/1190000041758784一、MySQL日志MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是二进制日志binlog(归档日志)、事务日志redolog(重做日志)和undolog(回滚日志)。日志关系如下图:二、redologre......
  • postgresql权限相关
    给用户赋予表的权限--赋予SELECT权限GRANTSELECTONTABLEtable_nameTOusername;--赋予INSERT,UPDATE,DELETE权限GRANTINSERT,UPDATE,DELETEONTABLEtable_nameTOusername;--赋予所有权限GRANTALLPRIVILEGESONTABLEtable_nameTO......
  • 【flask sqlalchemy】A,B两个模型,A是父级模型,B是子级模型。 B创建依赖A模型的id。 如何
    fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI']='数据库连接字符串'db=SQLAlchemy(app)#定义父级模型AclassA(db.Model):id=db.Column(db.Integer,primary_key=Tr......
  • openGauss MOT查询原生编译_JIT
    MOT查询原生编译(JIT)MOT使您可以在执行之前以原生格式(使用PREPARE语句)准备并分析预编译的完整查询。这种本机格式以后可以更有效地执行(使用EXECUTE命令)。这种类型的执行效率要高得多,因为在执行期间,本机格式绕过了多个数据库处理层。这种分工避免了重复的解析分析操作。LiteExecu......