SQL相关子查询是什么?和嵌套子查询有什么区别?
两者的各种叫法
- 相关子查询叫做:
Correlated Subqueries
- 非相关子查询也叫普通子查询或嵌套子查询:
Nested SubQueries
相关子查询MySQL解释
相关子查询是一个子查询中引用了某张表且这张表也在子查询外部被使用到。比如:
SELECT * FROM t1
WHERE column1 IN (
SELECT column1 FROM t2
WHERE t2.column2 = t1.column2);
请注意子查询有一个t1表column2的引用,尽管子查询的from语句中没有涉及t1表,这时mysql执行子查询却发现t1表在外部查询中。
假设表t1有一行数据(column1=5,column2=6),与此同时表t2有一行数据(column1=5,column2=7)。
如果是简单的子查询:
... WHERE column1 = ANY (SELECT column1 FROM t2)
结果将会是true,有数据返回。但是在这个例子中,where子句中的子查询会返回false,查不到任何数据,因为两张表的column2不匹配。
相关子查询
和普通子查询
(也叫非相关子查询
)的差别就在于这子查询中是否有对外部查询中涉及到的表的引用。
规则范围: MySQL从内到外执行执行。比如:
SELECT column1 FROM t1 AS x
WHERE x.column1 = (SELECT column1 FROM t2 AS x
WHERE x.column1 = (SELECT column1 FROM t3
WHERE x.column2 = t3.column1));
在这条语句中,x.column2
一定是表t2的列,因为查询SELECT column1 FROM t2 AS x ...
别名是x,它不是表t1的列是因为SELECT column1 FROM t1 ...
是一个外部查询。它俩中间还隔着一对圆括号。
相关子查询Wikipedia解释
相关子查询是使用外部查询中的值的子查询(嵌套在另一个查询中的查询)。因为子查询需为外部查询返回的每一行执行一次,所以它可能会很慢。
SELECT employee_number, name
FROM employees emp
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department = emp.department);
在上面的查询中,外部查询为:
SELECT employee_number, name
FROM employees emp
WHERE salary > ...
内部查询(相关子查询)为:
SELECT AVG(salary)
FROM employees
WHERE department = emp.department
在上面的嵌套查询中,须为每个员工重新执行内部查询。
相关子查询执行步骤拆解
看完官方和Wiki的解释,对相关子查询的描述基本一样,用自己的话说就是:
相关子查询被用来做逐行的处理,子查询会为外部查询出来的每一行执行内部SQL。(外部语句也可为update或delete语句)
可拆分成下面三个步骤:
- 外部查询拿到所有行
- 内部查询使用外部查询出来的每一行来执行自己逻辑
- 内部查询有结果返回则当前外部行被保留最终返回否则继续执行下一行
相关子查询和嵌套查询的区别
- 执行顺序:相关子查询是由外部查询驱动内部查询。 而正常的嵌套查询中,内部查询首先被立即执行,返回的值被外部查询使用并执行外部查询。
- 依赖性:相关子查询内部查询依赖于外部查询进行处理,而在嵌套查询中外部查询依赖于内部查询。
- 性能:使用相关子查询会使性能降低,因为它执行的次数远远大于嵌套查询的次数
参考资料
- MySQL reference correlated-subqueries
- Wikipedia Correlated_subquery
- GeeksforGeeks SQL Correlated Subqueries
- stackoom 子查询与相关子查询之间的区别
- 知乎:简单易懂教你学会SQL相关子查询
SQL相关子查询是什么?和嵌套子查询有什么区别?的更多相关文章
- [SQL SERVER系列]之嵌套子查询和相关子查询
子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...
- 相关子查询和嵌套子查询 [SQL Server]
SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提,假设Books表如下: 类编号 图书名 出版社 价格-------------- ...
- SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)
SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提, 假设Books表如下: 类编号 图书名 出版社 价格 ----------------------------------- ...
- ylb:子查询(嵌套子查询)和子查询(相关子查询)
ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...
- ylb:SQL 表的高级查询-多表连接和子查询
ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...
- SQL Server调优系列基础篇(子查询运算总结)
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
- java数据库编程之嵌套子查询及exists的使用
第四章:高级查询(二) 4.1:exists和not exists子查询 4.1.1:exists子查询 用exists作为子查询的where条件 语法:select,,,,,,from 表名 w ...
- 《数据库系统概念》4-DDL、集合运算、嵌套子查询
一.DDLa) SQL Data DefinitionSQL的基本数据类型有char(n).varchar(n).int.smallint.numeric(p,d).real,double preci ...
- Yii2.0ActiveRecord嵌套子查询(AR子查询)
yii2.0的ActiveRecord是可以嵌套子查询的. 比如从一个子查询里面筛选数据. 首先实例化出来一个Query对象,代表子查询. $subQuery = new \yii\db\Query( ...
随机推荐
- 010_Markdown学习
目录 Markdown学习 标题 三级标题 四级标题 五级标题 六级标题 字体 引用 分割线 图片 超链接 列表 表格 代码 Markdown学习 标题 三级标题 四级标题 五级标题 六级标题 字体 ...
- 使用AudioRecord录音
虽然不知道头文件是咋回事,但是还是得到了一个MP3文件,音质也很清晰.AudioRecord是先把录制的声音保存为字节流文件,可以边保存边读取,头文件是把保存的字节流文件解析为音频格式. public ...
- C1. Pokémon Army (easy version) 解析(DP)
Codeforce 1420 C1. Pokémon Army (easy version) 解析(DP) 今天我們來看看CF1420C1 題目連結 題目 對於一個數列\(a\),選若干個數字,求al ...
- C语言之 判断语句基础与if语句反汇编
0x01.判断语句介绍以及用法 判断语句有哪些? 1.If 用法1: if (条件) { //代码块 } 当条件成立,也就是为True时,执行{}中的代码 用法2: if(条件) { //代码块 } ...
- Java线程池初步解读
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 几个月前,写了一篇<Java并发学习(一):进程和线 ...
- vue-打包遇到的问题
vue-打包 打包后用iframe引入的html文件乱码 原因: 解决:用live server打开就不会乱码 生产环境移除所有的console命令 三种解决方法 发现vue-cli3.0在打包过程中 ...
- NB-IoT和LORA技术通信距离是一样的吗
如今物联网的无线通信技术非常多,这其中主要分为两大类:一类是以Zigbee.WiFi.蓝牙.Z-wave等短距离通信技术为主:另一类就是以LPWAN(low-powerWide-AreaNetwork ...
- Linux 系统编程 学习:01-进程的有关概念 与 创建、回收
Linux 系统编程 学习:01-进程的有关概念 与 创建.回收 背景 上一讲介绍了有关系统编程的概念.这一讲,我们针对 进程 开展学习. 概念 进程的身份证(PID) 每一个进程都有一个唯一的身份证 ...
- django JsonResponse返回中文时显示unicode编码(\u67e5\u8be2)
django JsonResponse返回中文时显示unicode编码(\u67e5\u8be2) 关注公众号"轻松学编程"了解更多. 原因 这个unicode编码,是python ...
- 浅谈 Tarjan 算法
目录 简述 作用 Tarjan 算法 原理 出场人物 图示 代码实现 例题 例题一 例题二 例题三 例题四 例题五 总结 简述 对于初学 Tarjan 的你来说,肯定和我一开始学 Tarjan 一样无 ...