sql嵌套查询效率_sql嵌套查询返回多个字段

sql嵌套查询效率_sql嵌套查询返回多个字段文章目录问题解决问题为了查询一个字段,使用了五层嵌套循环,但是花费了约1分钟但是5个表的数据每个最多只有10条,怎么会这么慢呢?解决比如查询语句SELECT*FROMstudet分析器会先看语句的第一个词,如果它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。内存中有student表接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析SELECT*FROMstudetWHEREstu_id=1

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

文章目录

问题

为了查询一个字段,使用了五层嵌套循环,但是花费了约1分钟
但是5个表的数据每个最多只有10条,怎么会这么慢呢?

解决

比如查询语句

SELECT * FROM studet

分析器会先看语句的第一个词,如果它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。 内存中有student表

接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析

SELECT * FROM studet WHERE stu_id=1

如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。

WHERE关键字后面的是条件表达式。条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。

这是执行一条sql语句发生的状况,那么如果进入嵌套查询

SELECT * FROM STUDENT WHERE stu_id IN (SELECT * FROM SC WHERE sc_id IN (SELECT * FROM SS))

分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针p1找到第一条记录,
在这里插入图片描述

接着找到WHERE关键字计算它的条件表达式,
如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。
如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把虚表返回给用户。
在这里插入图片描述

太可怕了,前面的sql查询一小步,仅仅移动一个指针指向后面的下一条数据,就是后面所有查询条件的一大步
在这里插入图片描述

(外面的那个SELECT)到WHERE关键字的时候,又进入了另一个SQL语句中,
分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入WHERE里分析里面的SQL语句,再把SC表装入内存,另一个指针(例如p2)指向SC表中的第一条记录,分析WHERE后面的条件表达式,依次进行分析,最后分析出一个虚表2。

那么可以继续推演,进入了SS表,把SS表放入内存中,继续where条件的判断,层层套娃

如果虚表为空表,虚表2 也就为false,不返回到SELECT,
而内存中student表的p1指向下一条记录,继续让SC表受尽折磨
p1每移动一次,后面所有的查询都会再次重复进行

如果虚表2不为空也就是有记录,那么虚表2 为true,返回到SELECT并把p1指向的记录添加到主SQL语句的虚表1当中。

(这也是为什么嵌套的SQL语句SELECT 后面为一般为的原因,因为它EXISTS返回的只是真或假,字段的名没有意义,用就行,当然用别的也不会错。 )

这里虽然嵌套的SQL语句分析完了,但主SQL语句只执行了一遍,也就是说p1指向Student的第一条记录,p1还要再指向Student表的下一条记录并分析,这样又进入了嵌套中的SQL语句,同上面说的一样分析。当p1也到了Student表的结尾,整个SQL语句结束。返回虚表1这一列。

其对于内存的消耗,与计算量的消耗非常高,复杂度是MxN次查询,
因为每一条数据都要和后面where的一次子查询的查询结果进行比对,1:N
每次查询分析到from的时候都会把表装进一次内存,创建一次临时表,MxN次的存入内存,内存消耗巨大

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169411.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言实现二叉树层序遍历

    c语言实现二叉树层序遍历 按层序遍历原则,应打印ABCDEFG,如何实现?1.使用队列,队列是先进先出,首先把A放进去,然后如果队列有元素,就出队A,然后把出队元素A的左右BC节点入队,然后B出队,把B的左右节点放进去(没有就继续出队C),C出队,把DE放进去,D出队,E出队,把FG放进去,然后出FG(因为FG左右节点没有数据,不用入队),循环条件是队列不能为空(才能实现出队操作)核心源码:voidLev…

    2022年5月11日
    41
  • android轮播图实现_ajax异步加载

    android轮播图实现_ajax异步加载这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影。    可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚接触的人来说可能太少了,下面我就把我使用过程中所知道的写了下来,希望可以帮助自己和别人更深入了解这个库的使用和配置。     GITHUB上的下载路径为:https:/

    2025年7月11日
    2
  • 区块链工程师需要掌握哪些技能?

    作者:Annchain(本文一切著作权归annchain技术团队所有,未经许可,不得转载。若需转载请联系页尾二维码。) 从2017年开始,区块链逐步成为互联网的风口浪尖。曝光度的激增带来了人才市场的火爆。 区块链所要求的知识并非什么特殊的或者新兴的知识,除了密码学领域的知识需要专门了解之外,其他知识和技能几乎都是一些比较通用的网络开发核心知识。 由于区块链行业涉及到的范…

    2022年4月5日
    55
  • 10种用于渗透测试的漏洞扫描工具有哪些_渗透测试和漏洞扫描区别

    10种用于渗透测试的漏洞扫描工具有哪些_渗透测试和漏洞扫描区别漏洞扫描工具是IT部门中必不可少的工具之一,因为漏洞每天都会出现,给企业带来安全隐患。漏洞扫描工具有助于检测安全漏洞、应用程序、操作系统、硬件和网络系统。黑客在不停的寻找漏洞,并且利用它们谋取利益。网络中的漏洞需要及时识别和修复,以防止攻击者的利用。漏洞扫描程序可连续和自动扫描,可以扫描网络中是否存在潜在漏洞。帮助It部门识别互联网或任何设备上的漏洞,并手动或自动修复它。在本文中,我们将介绍市场上可用的十大最佳漏洞扫描工具。1.OpenVAS漏洞扫描工具OpenVAS漏洞扫描器是

    2025年11月6日
    3
  • 牛客网–采药(01背包)

    牛客网–采药(01背包)

    2021年5月19日
    123
  • 【SSD目标检测】3:训练自己的数据集「建议收藏」

    【SSD目标检测】3:训练自己的数据集「建议收藏」前言:上一章已经详细介绍了SSD——多目标定位检测识别算法,该框架是Google开源的代码,所以自然有很多前辈做改进了。我也不过是站在前辈的肩膀上,这一章就是讲解如何训练自己的数据集,让SSD框架识别。源码也无偿奉上了哦!–—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-——-—-—-—-—-—-—-—-—-—-—-—-—-—-——-需要的链接处(待完善)–…

    2025年8月21日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号