嵌套查询与连接查询的性能

连接查询代替嵌套查询提高select效率 当数据库中含有大量数据时,而我们所需要的信息不再是仅仅局限于一个表中的数据信息,这时我们需要将对一个表进行信息查询转而变成对多个表进行信息搜索并进行组合。         解决这样的问题我们通常是运用嵌套查询的方法,首先先执行内部的子查询再将子查询的结果作为外层查询的数据源,最后再在其基础之上进行主查询。这样我们就相当于做了两次的查询select语句的效率也有所降低。而引入连接之后SQL Ser 阅读详情
   嵌套查询 与 连接查询 的性能: 连接查询一般较快 ; 子查询 很难被优化。(当然和DB优化有关,也可能子查询比连接查询快)其实不能一概而论的~~ 不过,问了下DBA同学,他建议是能用 join 的,尽量不要用嵌套查询。以下内容,部分是来自网上的一些观点,自己稍加整理的。
   子查询是实现关联式计算的一种实例,连接实现了关联式代数。关于关联式计算(relational calculus)和关联式代数(relational algebra),貌似比较数学或者理论性的东西理论,我也还没深入弄明白。
   很多人也说到,这个性能的比较,不能一概而论的,需要具体的每个Case具体分析。
   也有人说(并有在某种DBMS上用一个例子证明),子查询可以也可能被优化为与join一样的执行计划,性能可以一样的。
  说一下概念吧: 在一个SELECT语句的WHERE子句或HAVING子句中嵌套另一个SELECT语句的查询称为嵌套查询,又称子查询。 一个select...From...Where查询语句块可以嵌套在另一个select...From...Where查询块的Where子句中,称为嵌套查询。外层查询称为父查询,主查询。内层查询称为子查询,从查询。子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。子查询中不能有order by分组语句。先处理子查询,再处理父查询。 子查询除非能确保内层select只返回一个行的值,否则应在外层where子句中用一个in限定符,即要返回多个值,要用in或者not in哦,所以当在编译过程中出现“子查询只返回一个值”的错误时,就要考虑是不是要用in和not in.
   可以自己用写个PL/SQL写一段来看执行时间的差异,不过由于dbms的优化,我执行了几次,结果都不每次效率一致,因为查询后可能在dbms端由缓存、优化之类的:
declare
time1 timestamp(3);
time2 timestamp(3);
cou number;
begin
  select current_timestamp into time1 from dual;
  select count(p.id) into cou from product p where p.company_id in (select c.id from company c);
  --select count(p.id) into cou from product p inner join company c on p.company_id=c.id;
  select current_timestamp into time2 from dual;
  dbms_output.put_line(time1);
  dbms_output.put_line(time2);
  dbms_output.put_line(time2-time1);
  dbms_output.put_line(cou);
end;
   关于连接查询,以前总结过一下: http://www.51testing.com/index.php?uid-225738-action-viewspace-itemid-210222
   下面是我所查到的网页中的一些摘录:
Joining should always be faster - theoretically and realistically. Subqueries- particularly correlated - can be very difficult to optimise. If you think
about it you will see why - technically, the subquery could be executed oncefor each row of the outer query.
Subqueries such as that described are one instance of the way that  SQL  implements relational calculus (you will see that it is basically an "Exists" type of
operation). Joins are an implementation of relational algebra. The optimisation of relational algebraic operations is *very* well understood, while the calculus is much more difficult to optimise...
Realistically, most good DBMSs will optimise a query such as yours to use a join instead, thus converting the implementation from calculus to algebra.
In general, subqueries - particularly correlated - should be avoided unless absolutely necessary. It makes the query harder to read/maintain, pushes more work onto the  server , and is generally just a far less appropriate style. of SQL.
subquery is faster when we have to retrieve data from large number of tables.Because it becomes tedious to join more tables. join is faster to retrieve data from database when we have less number of tables
In general there is no reason to assume that a subquery will be faster or slower than a join.  Specific cases can point one way or the other, but there are too many variables for a general answer.  There are cases where a subquery should be faster - an EXISTS  test  against a JOIN, where the EXISTS stops at the first match but the JOIN has to deal with every match.
Note that in many cases the optimizer rewrites queries with correlated subqueries as outer joins, so in many cases the performance is the same.
更多相关讨论:
http://forums.devx.com/showthread.php?t=24593
http://www.eggheadcafe.com/software/aspnet/32705705/join-vs-subquery.aspx
http://blog.youkuaiyun.com/zxs820329/archive/2008/02/14/2094927.aspx
25、MySQL高级查询与嵌套查询全解析 本文深入解析了MySQL中的高级查询技术,包括数据排序、右连接与自然连接的使用,以及嵌套查询的多种类型(标量子查询、列子查询、行子查询和相关子查询)。通过具体示例展示了如何使用ANY、IN、ALL、EXISTS和NOT EXISTS等关键字实现复杂查询逻辑,并探讨了嵌套查询的性能优化策略,如使用连接查询替代嵌套查询、创建索引和分析查询执行计划。适合希望提升SQL查询能力的开发者和数据库管理员阅读,帮助在实际应用中更高效地处理复杂数据查询任务。 阅读详情

相关推荐

鸿蒙子系统解读-分布式软总线子系统初步研究(下)

鸿蒙子系统解读-分布式软总线子系统初步研究(下) 本文作者:江苏润和软件股份有限公司 郎建中 3.2. 数据传输 上一节我们看了PublishService()函数的代码实现过程。被发现端发布服务后,软总线回调发布成功的函数中,被发现端需要使用CreateSessionServer()来创建会话的服务器等待发现端的连接创建会话。下面我们就来分析CreateSessionServer()函数的实现过程。 数据传输部分的代码位于foundation/communication/services/softbus

weixin_47070198的博客 3091

Mysql中嵌套查询和连接查询的区别

一、嵌套查询 嵌套查询我们以mybatis中的嵌套查询举例: 1.1、创建数据库 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 ​ INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); ​ CREATE TAB...

qq_56568435的博客 8234

ROS2_control 对机器人控制(不完整,有时间再更新)

会提示安装好其他相应的东西# 本来应该还要有ros-humble-gz-ros2-control,但是直接安装提示定位不到ros2 control --help # 输出 Commands:list_controller_types 输出可用的控制器类型及其基类list_controllers 输出已加载控制器的列表、类型和状态list_hardware_components 输出可用硬件组件列表list_hardware_interfaces 输出可用命令和状态接口列表。

m0_52113469的博客 2469

Mysql的优化(一)嵌套查询与连接查询对比

Mysql的优化(一)嵌套查询与连接查询对比缘由问题表连接查询嵌套查询数据库查询原理与流程对比连接查询嵌套查询数据库查询原理与流程 缘由 一个我喜欢的小姐姐突然咨询了我关于连接查询与嵌套查询该使用哪个,我只能通过我的多年秃头经验给出要使用链连接查询,但是我并不能讲出准确的原因,事后粗浅了解了原理后记录下来给小姐姐,毕竟不能丢了我舔狗的尊严,如有不对地方欢迎大家指出。 变强警告 问题 我们在查询多...

kexian19931202的博客 5009

倾向得分匹配的stata命令_政策评估方法引荐|广义倾向得分匹配(GPSM)

和大家分享一下最近学习的进展,在痛苦读完stata journal和练习OA程序,已经可以基本完成广义倾向得分的估计了,在国内这一方法还没有形成广泛运用,因此学习资源也是有点稀缺的,在文章最后给各位提供数据和代码以供练习。有问题可以随时文末留言或者联系我哦。人文社会科学中一般无法在实验室中控制样本个体的特征,我们一般采用“准自然实验”的研究路径,也就是不随机安排样本接受处理与否。但放弃随机分组假定...

weixin_39550258的博客 1万+

Python爬虫实战:5分钟搞定大众点评评论数据抓取(附完整代码)

本文详细介绍了使用Python爬虫高效获取大众点评评论数据的5个关键技巧,包括环境配置、智能页面解析、反反爬策略、数据存储与容错设计以及性能优化。通过实战案例和完整代码,帮助开发者快速掌握文本挖掘技术,适用于市场分析和商业决策。

weixin_30660027的博客 290

MySQL基础篇 | 连接查询、子查询(嵌套)

MySQL基础篇【第四篇】| 连接查询(内连接和外连接)、子查询(嵌套)

m0_61933976的博客 1万+

2025机械考研复试面试问题汇总篇(含13门科目),考研机械复试专业面试常见重点问题总结!考研机械复试专业面试准备看这一篇就够了!

(完整版内容:)1.汇集了本科各科的重点知识及多个机械名校800多个常见问题,共8.7万字185页,涵盖机械所以专业课的重点知识和常见问答。 2.涉及机械大类重点科目,包括:材料力学、控制工程、数控技术、机械制造技术基础、理论力学、液压传动、机械设计、机械原理、工程材料、互换性与技术测量、测试技术、汽车理论、程序设计与C语言等13门必修课。

weixin_56510835的博客 1862

数据库(3)--嵌套查询和连接查询

1 查询选修了数据库原理的学生姓名。2 查询比计算机系所有学生年龄都大的学生信息。3列出“张力”选修的所有课程的课名和成绩。

码银的博客 1983

光通量与辐射通量之间的换算

由理论和实验可知存在两种定义: 1W1W1W(瓦特)的频率为540×1012Hz540\times10^{12}Hz540×1012Hz(赫兹)的单色辐射的辐射通量等于683lm(流明)683lm(流明)683lm(流明).。 1lm1lm1lm的频率为540×1012Hz540\times10^{12}Hz540×1012Hz的单色通量等于1683=0.001464W\frac{1}{683}=0.001464W6831​=0.001464W。 从上述定义中我们可以得到什么呢?我们知道光速: c=3×

u011699626的博客 3273

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 988

mysql嵌套查询效率低,连接查询代替嵌套查询提高select效率

当数据库中含有大量数据时,而我们所需要的信息不再是仅仅局限于一个表中的数据信息,这时我们需要将对一个表进行信息查询转而变成对多个表进行信息搜索并进行组合。解决这样的问题我们通常是运用嵌套查询的方法,首先先执行内部的子查询再将子查询的结果作为外层查询的数据源,最后再在其基础之上进行主查询。这样我们就相当于做了两次的查询select语句的效率也有所降低。而引入连接之后SQL Server将要执行的仅仅...

weixin_39626180的博客 2454

Cesium中级开发教程之二十二:视锥体

教程示例网站:https://thomaz529.github.io。

883

db2嵌套查询效率_嵌套查询与连接查询的性能

嵌套查询与连接查询的性能:连接查询一般较快;子查询很难被优化。(当然和DB优化有关,也可能子查询比连接查询快)其实不能一概而论的~~不过,问了下DBA同学,他建议是能用join的,尽量不要用嵌套查询。以下内容,部分是来自网上的一些观点,自己稍加整理的。子查询是实现关联式计算的一种实例,连接实现了关联式代数。关于关联式计算(relational calculus)和关联式代数(relational ...

weixin_39541227的博客 862

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

mysql 嵌套查询性能_MySQL数据库之嵌套查询与连接查询的性能详解

本文主要向大家介绍了MySQL数据库之嵌套查询与连接查询的性能详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。嵌套查询与连接查询的性能:连接查询一般较快;子查询很难被优化。(当然和DB优化有关,也可能子查询比连接查询快)其实不能一概而论的~~不过,问了下DBA同学,他建议是能用join的,尽量不要用嵌套查询。以下内容,部分是来自网上的一些观点,自己稍加整理的。子查询是实...

weixin_35336900的博客 1308

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

SQL Server 2022 嵌套查询实战:3类子查询与连接查询性能对比分析

本文深入分析了SQL Server 2022中IN、EXISTS和相关子查询三类嵌套查询与连接查询的性能差异。通过百万级数据的实测对比,揭示了不同查询方式的适用场景和优化策略,为数据库性能调优提供实用建议。重点关注连接查询在大型数据集中的显著优势。

weixin_28731223的博客 325

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SQL嵌套查询和链接查询

SQL嵌套查询和链接查询

dz45693的专栏 3167

MySQL 嵌套查询优化案例

点击关注公众号,利用碎片时间学习嵌套查询简单来说就是有子查询的SQL语句,子查询可以出现在SLECT, FROM或者WHERE 子句中,也可以单独用WITH子句来定义一个子查询。使用时子查...

Java笔记虾 516

sql复杂嵌套查询

最近在做各类小应用,用到了MYSQL,有时候会用到一些比较复杂的嵌套查询,在研究怎么通过SQL实现这些。 假设下面这张表(stu)描述学生的基本信息: id name grade 1 Jim 7 2 Tom 8 3 Cake 9 … … …另外一张表(sco)描述学生的成绩信息: stu_id subject score 1

dreamer2020的专栏 3万+

MySQL——优化嵌套查询和分页查询

优化嵌套查询嵌套查询(子查询)可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。嵌套查询写起来简单,也容易理解。但是,有时候可以被更有效率的连接(JOIN)替代。现在假如要找出从来没有在网站中消费的客户,也就是查询在客户customer表中但是不在支付payment表中的客户信息。嵌套查询:explain select * from...

205

db2嵌套查询效率_利用散列连接从DB2通用数据库获得最佳性能

DB2 UDB 优化器可以在执行连接时选择不同方法:在缺省情况下,它在嵌套循环连接(nested loop join)与合并连接(merge join)之间选择。当设置了特殊环境变量时,它还可以选择散列连接(hash join)。散列连接可显著提高某些查询的性能,在决策支持系统(Decision Support System,DSS)环境中尤为突出,因为该环境中的查询比较复杂。本文旨在说明散列连接...

weixin_42168341的博客 492

pyDAL一个python的ORM(10) pyDAL的连接查询1

pyDAL的连接查询,嵌套查询和连接查询 有何区别联系

u010018782的博客 1314

关于嵌套查询和连接查询的效率问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33955681的博客 4754

【嵌套查询】查询中的查询:深入理解子查询 (Subquery)

摘要:本文介绍了SQL中的子查询(Subquery)技术,重点讲解了在WHERE和SELECT子句中使用子查询的方法。通过实际示例演示了如何查找下过订单的顾客、统计顾客订单数等场景,并分析了关联子查询的执行逻辑和性能考量。作为SQL进阶查询的重要技术,子查询为处理多表关联数据提供了灵活解决方案,同时也为后续学习更高效的JOIN操作奠定了基础。

qq_63553317的博客 959

Mysql 嵌套查询 优化

我整理的一些关于【MySQL,SQL】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/yOSbkRMySQL 嵌套查询优化 在MySQL中,嵌套查询(又称子查询)是一种常见的查询方式,它允许在一个查询中嵌套另一个查询,以便从多个表中提取信息。然而,过度使用嵌套查询可能会导致性...

weixin_36851003的博客 356

GBase 8a数据库嵌套查询-IN谓词子查询

在嵌套查询中,子查询的结果往往是一个集合,所以谓词 IN 是嵌套查询中最经常使用的谓词。 例 1.17 查询“张一川”所订的订单号的基本信息: select * from orders where customer_num in ( select customer_num from customer where cname=‘张一川’); 查询结果为: order_num customer_num order_date ship_date paid_date 1001 101

kevindaddy的博客 1383
上一篇: MySQL 的 RowNum 实现
下一篇: easy ui layout 高度 宽度自适应浏览器
CodingSir
博客等级 码龄21年 2149粉丝 812原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值