SQL相关子查询是什么?和嵌套子查询有什么区别?
文章目录
- 两者的各种叫法
- 相关子查询MySQL解释
- 相关子查询Wikipedia解释
- 相关子查询执行步骤拆解
- 相关子查询和嵌套查询的区别
- 参考资料
两者的各种叫法
- 相关子查询叫做:
Correlated Subqueries
- 非相关子查询也叫普通子查询或嵌套子查询:
Nested SubQueries
相关子查询MySQL解释
相关子查询是一个子查询中引用了某张表且这张表也在子查询外部被使用到。比如:
SELECT * FROM t1
WHERE column1 IN (SELECT column1 FROM t2WHERE 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 xWHERE x.column1 = (SELECT column1 FROM t2 AS xWHERE x.column1 = (SELECT column1 FROM t3WHERE x.column2 = t3.column1));
在这条语句中,x.column2
一定是表t2的列,因为查询SELECT column1 FROM t2 AS x ...
别名是x,它不是表t1的列是因为SELECT column1 FROM t1 ...
是一个外部查询。它俩中间还隔着一对圆括号。
相关子查询Wikipedia解释
相关子查询是使用外部查询中的值的子查询(嵌套在另一个查询中的查询)。因为子查询需为外部查询返回的每一行执行一次,所以它可能会很慢。
SELECT employee_number, nameFROM employees empWHERE salary > (SELECT AVG(salary)FROM employeesWHERE department = emp.department);
在上面的查询中,外部查询为:
SELECT employee_number, nameFROM employees empWHERE salary > ...
内部查询(相关子查询)为:
SELECT AVG(salary)FROM employeesWHERE department = emp.department
在上面的嵌套查询中,须为每个员工重新执行内部查询。
相关子查询执行步骤拆解
看完官方和Wiki的解释,对相关子查询的描述基本一样,用自己的话说就是:
相关子查询被用来做逐行的处理,子查询会为外部查询出来的每一行执行内部SQL。(外部语句也可为update或delete语句)
可拆分成下面三个步骤:
- 外部查询拿到所有行
- 内部查询使用外部查询出来的每一行来执行自己逻辑
- 内部查询有结果返回则当前外部行被保留最终返回否则继续执行下一行
相关子查询和嵌套查询的区别
- 执行顺序:相关子查询是由外部查询驱动内部查询。 而正常的嵌套查询中,内部查询首先被立即执行,返回的值被外部查询使用并执行外部查询。
- 依赖性:相关子查询内部查询依赖于外部查询进行处理,而在嵌套查询中外部查询依赖于内部查询。
- 性能:使用相关子查询会使性能降低,因为它执行的次数远远大于嵌套查询的次数
参考资料
- MySQL reference correlated-subqueries
- Wikipedia Correlated_subquery
- GeeksforGeeks SQL Correlated Subqueries
- stackoom 子查询与相关子查询之间的区别
- 知乎:简单易懂教你学会SQL相关子查询
SQL相关子查询是什么?和嵌套子查询有什么区别?相关推荐
- oracle模糊查询中的regexp_like嵌套子查询用法
oracle模糊查询中的regexp_like嵌套子查询用法 regexp_like一般用于模糊查询某一列时包含多个查询条件 需求1:在用户表中查询出账号包含650000和230000的用户. sel ...
- MySQL数据库---子查询insert,update,delete语句中嵌套子查询
十.子查询的使用(重点) 1.子查询:指的是查询语句,嵌套查询语句---->一般是放在where子句中,表示条件. 2.子查询的应用使用场景: 2.1查询过程中,虽然给了条件,但是条件的结果并不 ...
- from server sql 拼接统计两个子查询_[SQL SERVER系列]之嵌套子查询和相关子查询
子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...
- ylb:子查询(嵌套子查询)和子查询(相关子查询)
ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...
- SQL——相关子查询和不相关子查询
SQL--相关子查询和不相关子查询 不相关子查询 相关子查询 在SQL中经常使用在"FROM/WHERE"字句中包含一个形如"SELECT-FROM-WHERE" ...
- 相关子查询和嵌套子查询两者之间的区别
相关子查询和嵌套子查询两者之间的区别 表的结构如下: mysql> select * from product; +----+------+-------+-----+ | id | name ...
- oracle多表嵌套查询使用,oracle sql 多表 嵌套子查询 连接查询, join where exist i...
转:http://hi.baidu.com/delphi_relive/blog/item/d7c0034a49c4932208f7ef21.html in 和 exists也是很好区别的. in 是 ...
- SQL语句中的嵌套子查询
文章目录 相关子查询 自身连接 一开始在学习的SQL语句的时候,没有感受到嵌套子查询的厉害,尤其是相关子查询.现在发现它的厉害之处,写下来记录! 相关子查询 先抛出一个问题来引出这个话题.查找每个学生 ...
- SQL:多表查询语句(嵌套子查询,多表连接)操作实例
一.SQL Server多表查询,包括连接操作和嵌套子查询 背景知识: 一.连接:分成内连接和外连接,内连接相当于取交集,外连接相当于取并集 二.嵌套子查询:连接操作浪费资源,使用嵌套子查询可以避免连 ...
最新文章
- php怎麼讲$字段的值截取第一个字,PHP截取中文字符串方法总结
- 发现一个控件,介绍一下
- sql注入空格被过滤_网站渗透:SQL注入与WAF绕过思路分享
- 后PC时代的桌面虚拟化解决方案——VMware View 5
- keras保存的h5、hdf5模型,加载时出现“AttributeError: ‘str‘ object has no attribute ‘decode‘ “
- EOS钱包开发注意交易消失的情况
- 织梦套用html模板文件,织梦CMS套模板建站流程
- 【概率论与数理统计(研究生课程)】知识点总结4(随机变量的数字特征)
- 密度测量:1.密度测量的基础知识
- Vue 项目提示:`(Emitted value instead of an instance of Error) the “scope“ attribute for scoped slots
- 基于Java的旅行管理系统的设计与实现
- 基于STM32F103RCT6实现串口中断发送,使用环形队列
- MYSQL安装和初始化配置
- 覆盖常见四大应用场景,华为云CDN能够更好满足企业业务加速需求
- 写计算机老师的一封信200,写给老师的一封信200字7篇精选整合
- ThnBoV1.3.0一款针对WordPress开发的缩略图美化插件
- NR基础1-NR帧结构
- 培训机构炒出来的Unity就业没问题吗
- 【经典算法】:狐狸抓兔子问题
- 输电线路综合在线监测装置