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次的存入内存,内存消耗巨大

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 进程间通信方式以及各自的优缺点是什么_android进程间通信方式

    进程间通信方式以及各自的优缺点是什么_android进程间通信方式1)管道管道分为有名管道和无名管道无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。有名管道也是一种半双工的通信方式,但是它允许

  • android 打开相册_安卓系统照片在哪个存储文件中

    android 打开相册_安卓系统照片在哪个存储文件中在GoogleNexus7(Version4.4.2)平板出现之前,Intent.ACTION_GET_CONTENT打开相册会返回如下形式的Uri: content://media/external/images/media/3951,  使用ContentResolver查询MediaStore.Images.Media.DATA就可以找文件

  • String 转 JSONArray 日常挖坑填坑

    String 转 JSONArray 日常挖坑填坑1.lists里面的Map中的key不为list时均正常   List<Map<String,String>>lists=null;   if(cmtMaps.containsKey("cmtComments")){      lists=JSONArray.parseObject(cmtMaps.get("cmtComments"),Li…

  • python win32api教程_python通过api获取数据

    python win32api教程_python通过api获取数据0x01Win32API简介Win32API即为Microsoft32位平台(包括:Windows9x,WindowsNT3.1/4.0/5.0,WindowsCE等)的应用程序编程接口(ApplicationProgrammingInterface),是构筑所有32位Windows平台的基石,所有在Win32平台上运行的应用程序都可以调用这些函数。使用Win32API,应用…

    2022年10月11日
  • 【动画教程】真封神南极服务端2.52架设第二集

    【动画教程】真封神南极服务端2.52架设第二集官方网站动画名称:真封神南极服务端2.52架设第二集主讲人:diablo2208教程下载地址:http://pan.baidu.com/s/1qW8pwCk

  • mybatis-plus超详细讲解[通俗易懂]

    mybatis-plus超详细讲解[通俗易懂]mybatis-puls超详细讲解本文笔记都是观看狂神老师视频手敲的,敲完的时候发现一件挺奔溃的事,视频地址:https://www.bilibili.com/video/BV17E411N7KN视频地址这个老师讲课真的很好,学java后端的都可以去看一下,从基础到架构很详细,推荐给大家https://space.bilibili.com/95256449/狂神说最近做项目听到老师讲到使用…

发表回复

您的电子邮箱地址不会被公开。

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