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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 偏态分布学习笔记(期望,中位数,众数)

    偏态分布学习笔记(期望,中位数,众数)一:偏态函数分类(1)正态(期望=中位数=众数)(2)正偏态:也称为右偏态(期望>中位数>众数)(3)负偏态:也称左偏态(期望<中位数<众数)二:如何辨认正负偏态函数关键:看尾巴哪边长,左边尾巴长的成为左偏态(负偏态),反之右偏态(正偏态)三:关于期望,中位数,众数参考上面的草图:可以这样理解,(1)对于正偏态而言,数据大多分布在右侧,从而也就把期望与中位数往右侧移动。(2)对于负偏态而言,数据大多分布在左侧,从而也就把期望与中位数往左侧移动。…

    2025年11月12日
    5
  • platform_driver_register调用probe

    platform_driver_register调用probekernel_init中do_basic_setup()->driver_init()->platform_bus_init()->…初始化platformbus(虚拟总线)设备向内核注册的时候platform_device_register()->platform_device_add()->…内核把设备挂在虚拟的platformbus下驱动注册的时候platform_dri

    2022年7月12日
    23
  • html 竖排导航条,html 导航栏

    html 竖排导航条,html 导航栏html>lvnian学习(http://lvnian.blog.51cto.com/)ul{list-style-type:none;margin:0;padding:0;}a:link,a:visited{display:block;font-weight:bold;color:#FFFFFF;background-color:#98bf21;width:120px;text-align…

    2022年5月28日
    48
  • 苹果CMS

    苹果CMS

    2021年10月31日
    71
  • java如何打印菱形_JAVA输出菱形

    java如何打印菱形_JAVA输出菱形菱形的打印方式,通过确定中间行,确定奇数然后做的处理,思路:上面部分通过确定打印数量为奇数,然后采用公式计算出奇数来,下面因为空格数量就是总行数减中间行数-1计算的,这样就可以计算出要打印的*的数量publicclassTestFile{ publicstaticvoidmain(String[]args){ //TODOAuto-generatedm…

    2022年9月29日
    4
  • docker(7)docker-compose容器集群编排「建议收藏」

    docker(7)docker-compose容器集群编排「建议收藏」前言实际工作中我们部署一个应用,一般不仅仅只有一个容器,可能会涉及到多个,比如用到数据库,中间件MQ,web前端和后端服务,等多个容器。我们如果一个个去启动应用,当项目非常多时,就很难记住了,所有

    2022年7月31日
    11

发表回复

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

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