我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SQ中查询底层运行原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SQ中查询底层运行原理是什么

小编给大家分享一下SQ中查询底层运行原理是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

数据准备

本文旨在说明SQL查询的执行过程,不会涉及太复杂的SQL操作,主要涉及两张表: citizen 和 city ,具体数据如下所示:

CREATE TABLE citizen ( 
 name CHAR ( 20 ), 
 city_id INT ( 10 ) 
);


CREATE TABLE city (
 city_id INT ( 10 ), 
 city_name CHAR ( 20 ) 
);

INSERT INTO city
VALUES
 ( 1, "上海" ),
 ( 2, "北京" ),
 ( 3, "杭州" );
 
 
INSERT INTO citizen
VALUES
("tom",3),
("jack",2),
("robin",1),
("jasper",3),
("kevin",1),
("rachel",2),
("trump",3),
("lilei",1),
("hanmeiei",1);

查询执行顺序

本文所涉及的查询语句如下,主要是citizen表与city表进行join,然后筛掉city_name != "上海"的数据,接着按照city_name进行分组,统计每个城市总人数大于2的城市,具体如下:

查询语句

SELECT 
 city.city_name AS "City",
 COUNT(*) AS "citizen_cnt"
FROM citizen
 JOIN city ON citizen.city_id = city.city_id 
WHERE city.city_name != '上海'
GROUP BY city.city_name
HAVING COUNT(*) >= 2
ORDER BY city.city_name ASC
LIMIT 2

执行步骤

上面SQL查询语句的书写书序是:

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

但是执行顺序并不是这样,具体的执行顺序如下步骤所示:

  • 1.获取数据 ( From, Join )

  • 2.过滤数据 ( Where )

  • 3.分组 ( Group by )

  • 4.分组过滤 ( Having )

  • 5.返回查询字段 ( Select )

  • 6.排序与分页 ( Order by & Limit / Offset )

尖叫提示:本文旨在说明通用的SQL执行底层原理,对于其优化技术不做考虑,比如谓词下推、投影下推等等。

执行的底层原理

其实上面所说的SQL执行顺序就是所谓的底层原理,当我们在执行SELECT语句时,每个步骤都会产生一张 虚拟表(virtual table) ,在执行下一步骤时,会将该虚拟表作为输入。指的注意的是,这些过程是对用户透明的。

你可以注意到,SELECT 是先从FROM 这一步开始执行的。在这个阶段,如果是多张表进行JOIN,还会经历下面的几个步骤:

获取数据 ( From, Join )

  • 首先会通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt1-1;

  • 接着通过ON 条件进行筛选,虚拟表 vt1-1 作为输入,输出虚拟表 vt1-2;

  • 添加外部行。我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3

过滤数据 ( Where )

经过上面的步骤,我们得到了一张最终的虚拟表vt1,在此表之上作用where过滤,通过筛选条件过滤掉不满足条件的数据,从而得到虚拟表vt2。

分组 ( Group by )

经过where过滤操作之后,得到vt2。接下来进行GROUP BY操作,得到中间的虚拟表vt3。

分组过滤 ( Having )

在虚拟表vt3的基础之上,使用having过滤掉不满足条件的聚合数据,得到vt4。

返回查询字段 ( Select )

当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT 阶段。首先在 SELECT 阶段会提取目标字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表 vt5-1 和 vt5-2。

排序与分页 ( Order by & Limit / Offset )

当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段,得到虚拟表 vt6。最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段,得到最终的结果,对应的是虚拟表 vt7

详细执行步骤分析

Step 1:获取数据 ( From, Join )

FROM citizen
JOIN city

该过程的第一步是执行From子句中的语句,然后执行Join子句。这些操作的结果是得到两个表的笛卡尔积。

namecity_idcity_idcity_name
tom31上海
tom32北京
tom33杭州
jack21上海
jack22北京
jack23杭州
robin11上海
robin12北京
robin13杭州
jasper31上海
jasper32北京
jasper33杭州
kevin11上海
kevin12北京
kevin13杭州
rachel21上海
rachel22北京
rachel23杭州
trump31上海
trump32北京
trump33杭州
lilei11上海
lilei12北京
lilei13杭州
hanmeiei11上海
hanmeiei12北京
hanmeiei13杭州

在FROM和JOIN执行结束之后,会按照JOIN的ON条件,筛选所需要的行

ON citizen.city_id = city.city_id
namecity_idcity_idcity_name
tom33杭州
jack22北京
robin11上海
jasper33杭州
kevin11上海
rachel22北京
trump33杭州
lilei11上海
hanmeiei11上海

Step 2:过滤数据 ( Where )

获得满足条件的行后,将传递给Where子句。这将使用条件表达式评估每一行。如果行的计算结果不为true,则会将其从集合中删除。

WHERE city.city_name != '上海'
namecity_idcity_idcity_name
tom33杭州
jack22北京
jasper33杭州
rachel22北京
trump33杭州

Step 3:分组 ( Group by )

下一步是执行Group by子句,它将具有相同值的行分为一组。此后,将按组对所有Select表达式进行评估,而不是按行进行评估。

GROUP BY city.city_name
GROUP_CONCAT(citizen. name )city_idcity_name
jack,rachel2北京
tom,jasper,trump3杭州

Step 4:分组过滤 ( Having )

对分组后的数据使用Having子句所包含的谓词进行过滤

HAVING COUNT(*) >= 2

Step 5:返回查询字段 ( Select )

在此步骤中,处理器将评估查询结果将要打印的内容,以及是否有一些函数要对数据运行,例如Distinct,Max,Sqrt,Date,Lower等等。本案例中,SELECT子句只会打印城市名称和其对应分组的count(*)值,并使用标识符“ City”作为city_name列的别名。

SELECT 
 city.city_name AS "City",
 COUNT(*) AS "citizen_cnt"
citycitizen_cnt
北京2
杭州3

Step 6:排序与分页 ( Order by & Limit / Offset )

查询的最后处理步骤涉及结果集的排序与输出大小。在我们的示例中,按照字母顺序升序排列,并输出两条数据结果。

ORDER BY city.city_name ASC
LIMIT 2
citycitizen_cnt
北京2
杭州3

以上是“SQ中查询底层运行原理是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SQ中查询底层运行原理是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

docker运行的底层原理是什么

这篇文章将为大家详细讲解有关docker运行的底层原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 docker是一个client-server结构的系统,docker守护进程运行在主机上
2023-06-04

InnoDB底层原理是什么

这篇文章主要为大家展示了“InnoDB底层原理是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“InnoDB底层原理是什么”这篇文章吧。InnoDB,是MySQL的数据库引擎之一,现为MySQ
2023-06-27

Spring底层原理是什么

这篇文章主要讲解了“Spring底层原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring底层原理是什么”吧!Spring简介ClassPathXmlApplicationCo
2023-07-05

Java中LinkedHashMap 的底层原理是什么

本篇文章为大家展示了Java中LinkedHashMap 的底层原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。默认情况下,LinkedHashMap的迭代顺序是按照插入节点的顺序。也可以通
2023-06-15

java中CAS的底层原理是什么

今天就跟大家聊聊有关java中CAS的底层原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基
2023-06-14

linux中mutex的底层原理是什么

在Linux中,mutex的底层原理主要是基于原子操作和内核态的同步机制来实现的。具体来说,Linux中的mutex通常是通过spinlock(自旋锁)来实现的。当一个线程尝试获取mutex时,它会先尝试通过原子操作来修改mutex的状态
linux中mutex的底层原理是什么
2024-03-15

HashMap的底层原理是什么

这篇文章将为大家详细讲解有关HashMap的底层原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一:HashMap的节点:HashMap是一个集合,键值对的集合,源码中每个节点用No
2023-06-04

redis锁底层原理是什么

Redis的锁底层原理是基于Redis的单线程特性和原子操作来实现的。当一个客户端尝试获取锁时,它会向Redis发送一个SETNX命令,该命令会在键不存在的情况下将键的值设置为指定的值。因为SETNX是一个原子操作,所以只有一个客户端能够成
2023-09-06

Python matplotlib底层原理是什么

本篇内容介绍了“Python matplotlib底层原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. matplotlib 框
2023-06-21

Vue的底层原理是什么

这篇文章主要介绍Vue的底层原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Observer (数据劫持)核心是通过Obeject.defineProperty()来监听数据的变动,这个函数内部可以定义set
2023-06-29

Java NIO底层原理是什么

这篇文章主要介绍“Java NIO底层原理是什么”,在日常操作中,相信很多人在Java NIO底层原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java NIO底层原理是什么”的疑惑有所帮助!接下来
2023-06-16

golang channel底层原理是什么

Golang的channel底层原理是基于通信顺序进程(Communicating Sequential Processes,简称CSP)模型实现的。在Golang中,channel是一种用于在goroutine之间进行通信和同步的机制。
golang channel底层原理是什么
2024-02-29

Go中闭包的底层原理是什么

这篇文章将为大家详细讲解有关Go中闭包的底层原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 什么是闭包?一个函数内引用了外部的局部变量,这种现象,就称之为闭包。例如下面的这段代码中,adde
2023-06-25

python 中GIL锁的底层原理是什么

这篇文章将为大家详细讲解有关python 中GIL锁的底层原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python可以做什么Python是一种编程语言,内置了许多有效的工具,Py
2023-06-14

mongodb底层存储原理是什么

MongoDB的底层存储原理是使用一种称为B树(B-Tree)的数据结构来存储数据。B树是一种平衡的多路搜索树,它通过将数据按照顺序存储在磁盘上的块中,以提高数据的访问效率。具体来说,MongoDB使用了一种称为Mmapv1的存储引擎,该存
2023-09-06

编程热搜

目录