SQL查询的执行流程

SQL查询的执行流程

      • ✨ 1、书写顺序和执行顺序
      • ✨ 2、SQL的执行流程
      • ✨ 3、WHERE与ON的使用




✨ 1、书写顺序和执行顺序


查询是DBMS(OLTP)和OLAP中最常用的操作。我们在理解SELECT语法的时候,还需要了解SELECT执行时的底层原理。只有这样,才能让我们对SQL有更深刻的认识

我们只需要记住和理解SELECT查询时的两个顺序:书写顺序和执行顺序

执行顺序书写顺序
9SELECT
10DISTINCT
1FROM
3JOIN
2ON
4WHERE
5GROUP BY
7WITH CUBE/ROLLUP
6AGG_FUNC
8HAVING
11ORDER BY
12LIMIT

在SELECT语句执行这些步骤的时候,基本每个步骤都会产生一个虚拟表,然后将这个虚拟表传入下一个步骤作为输入。需要注意的是,这些虚拟表隐含在SQL的执行过程中,对于我们来说是不可见的

✨ 2、SQL的执行流程


所有的查询语句都是从FROM子句开始执行的。一个完整的SELECT查询SQL执行流程(以MySQL为例)如下:

  • 🎈第一步(FROM):对FROM子句中的前两表执行笛卡尔积(交叉连接),生成虚拟表vt1
  • 🎈第二步(ON):对vt1应用ON筛选器,筛选出满足ON表达式的行,生成虚拟表vt2
  • 🎈第三步(JOIN):保留表中未匹配的行将作为外部行添加到vt2。如果是LEFT JOIN,将左表在第二步中过滤的行添加进来;如果是RIGHT JOIN,将右表在第二步中过滤的行添加进来,生成虚拟表vt3

💡 注意:如果FROM子句中有多于两个表,那么就将vt3和第三个表连接计算笛卡尔乘积,生成虚拟表,即重复1-3步骤,最终得到一个新的虚拟表vt3

  • 🎈第四步(WHERE):对vt3应用WHERE筛选器,生成虚拟表vt4
  • 🎈第五步(GROUP BY):GROUP BY子句将对vt4按指定列唯一值进行分组,每一组仅包含一行,得到虚拟表vt5

💡 注意:由于vt5的结果集中每个组只包含一行,因此后面的操作只能得到vt5的列或基于每组内的一行数据操作

  • 🎈第六步(聚合函数):对每组内的一行数据应用聚合函数,生成虚拟表vt6
  • 🎈第七步(WITH CUBE/ROLLUP):如果与GROUP BY一起使用,计算不同维度层次结构级别下的聚合(vt6)
  • 🎈第八步(HAVING):对vt5的每组数据或vt6聚合结果应用HAVING筛选器,生成虚拟表vt7

💡 注意:这一步是第一个可以使用SELECT列的别名的步骤

  • 🎈第九步(SELECT):从vt7中筛选列,生成虚拟表vt8
  • 🎈第十步(DISTINCT):移除vt8中相同的行(去重),生成虚拟表vt9

💡 注意:如果执行了GROUP BY,DISTINCT将是多余的。因为GROUP BY将列中相同值的分成一组,同时只为每一组返回一行记录,那么所有的记录都将是不相同的

  • 🎈第十一步(ORDER BY):对vt9按指定字段排序,生成一个游标vc10,而不是虚拟表

💡 注意:SQL是基于集合理论的,集合不会预先对它进行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询返回一个游标对象,这个对象是包含特定物理顺序的逻辑组织。正因为返回值是游标,所以使用ORDER BY子句查询不能应用于表达式。排序是很需要成本的,除非必须要排序,否则最好不要指定ORDER BY。另外,这一步是第二个可以使用SELECT列的别名的步骤

  • 🎈第十二步(LIMIT):从游标vc10开始处选择指定数量的行,生成最终表返回给客户端

✨ 3、WHERE与ON的使用


对于包含OUTER JOIN子句的查询,到底是在ON筛选器里指定逻辑过滤条件还是用WHERE筛选器指定逻辑过滤条件呢?

实际上,ON和WHERE的最大区别在于,如果在ON中应用逻辑表达式,那么在第三步OUTER JOIN中还可以把过滤的行再次添加回来匹配。而WHERE一旦被过滤就找不回来了

简单来说就是,当有外关联表时(左连接和右连接),ON主要是针对外关联表进行筛选,主表信息保留;当不是外关联表时,两者作用相同

例如左外连接时,首先执行ON,筛选掉外关连表中不符合ON表达式的数据,JOIN时再将这部分数据进行与主表匹配;而WHERE的筛选是对ON关联后的结果进行整体筛选

假设有一个学生表(班级,ID,姓名)和一个成绩表(ID,姓名,成绩):

create table stu (bj string,id string,name string
)insert into stu values
('1', '108', 'a'),
('2', '105', 'b'),
('2', '101', 'c'),
('2', '109', 'd'),
('1', '106', 'e');create table score (id string,name string,score double
)insert into score values
('108', 'a', 80),
('105', 'b', 90),
('110', 'f', 87),
('109', 'd', 85),
('106', 'e', 78);

🌴 学生表(stu):

bjidname
1108a
2109d
1106e
2101c
2105b

🌴 成绩表(score):

idnamescore
109d85.0
106e78.0
110f87.0
108a80.0
105b90.0

现在需要返回一个X班级的全体同学的成绩,但是这个班级有几个学生缺考,也就是说在成绩表中没有记录。为了得到预期的结果,首先就需要在ON子句指定学生表和成绩表的关系(学生.ID=成绩.ID)

🌼 如果在ON子句中应用学生.班级=X:

select a.bj,a.id,a.name,b.score 
from stu a 
left join score b
on a.id=b.id and a.bj='2'

LEFT JION会把班级X在第二步中过滤的记录找回主表(保留表)匹配,匹配不到的数据补NULL

bjidnamescore
2101cNULL
1108aNULL
2105b90.0
2109d85.0
1106eNULL

🌼 如果在WHERE中筛选学生.班级=X:

select a.bj,a.id,a.name,b.score 
from stu a 
left join score b
on a.id=b.id 
where a.bj='2'

则只打印X班级的学生信息,其它班级的学生信息则会被永久过滤

bjidnamescore
2101cNULL
2109d85.0
2105b90.0

总结来说就是,ON会显示所有匹配条件的值,不匹配条件的数据补NULL;WHERE只显示满足条件的数据



参考文章:https://www.cnblogs.com/antLaddie/p/17175396.html


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于运动方程的多种滤波器仿真比较(KF\EKF\IMM\MC\IKF\UKF)

EKF_3.m KF_6.m kfilter.m MC.m trackAEKF.m trackEKF.m trackEKF_8.m trackEKF_Z5.m tracklMM.m trackKF.m trackUKF.m %-------------------

SquareLine Studio:快速创建美观的用户界面

文章目录 SquareLine Studio 简介1.1 什么是 SquareLine Studio1.2 目标用户群体 功能与服务2.1 拖放式 UI 编辑器2.2 订阅计划 下载与安装3.1 当前版本下载3.2 下载存档 保持更新4.1 订阅新闻通讯订阅流程新闻通讯内容订阅的好处 其他资源5.1 快速链接5.2 开发者服务 应用场景…

领夹麦克风什么样的好,麦克风品牌排行榜前十名,无线麦克风推荐

​在人人可做自媒体的时代,众多普通人加入自媒体。对拍视频的自媒体人,好内容是基础,好设备是保障。想提升视频音质需专业无线麦克风。现无线麦克风品牌多,如何少花钱买高性价比产品是问题。作为资深自媒体人,我用过的…

c++题目_怎么又得数颜色

题目背景 这个暑假,小Z的空闲时间都在看2020东京奥运会。 看着看着,小Z想出了一个问题。 题目描述 小Z得到了一些国家的获奖信息,他想让你帮助他生成一下“奥运奖牌榜”。 获奖信息有很多行,每行包含两部分:第一部…

idea中,我获取了getTotal方法,如何自动在等式左边生成一个接收的变量呢: page.getTotal();

在 IntelliJ IDEA 中,可以通过以下步骤让 IDEA 自动生成一个变量来接收 page.getTotal() 的返回值: 光标定位: 将光标放置在 page.getTotal(); 这行代码的末尾。 快捷键: 按 Alt Enter (Windows/Linux) 或 Option Enter (Mac) 以…

postgreSQL学习

postgreSql学习 学习参考:1、命令1.1 登录1.2 关闭连接 2、常用数据类型2.1 数值类型2.2 字符串类型2.3 时间2.4 其他 3、自增主键4、sql4.1 库操作(1)创建新库(2)切换数据库(3)删库【谨慎&…

电子看板,实现生产现场数字化管理

如何提高生产效率、优化资源配置、保障产品质量,成为企业在激烈竞争中脱颖而出的关键。电子看板作为一种创新的生产管理工具,为实现生产现场数字化管理提供了有力支持。电子看板是生产现场的“智能窗口”,它能够实时、准确地展示各类关键信息…

《2024年新生代妈妈真实孕育状态洞察报告》

专注于行业分析与市场研究的专业机构易观分析,正式发布了其最新研究成果——《2024年新生代妈妈真实孕育状态洞察报告》。该报告深入探讨了新生代妈妈在孕育过程中的实际需求与挑战,通过对母婴行业的市场规模、消费行为、用户触媒习惯、用户关怀以及特定品类场景的细致分析,揭示…

日元跌破160大关,日本当局何时干预?

KlipC报道:6月26日,日元又跌了,美元兑日元跌破160的整关口,超过了4月日本官员在市场上干预的水平,创1986年来新低。美联储降息的可能性降低,市场预计日元有可能延续当前的弱势。 KlipC分析师David表示&…

Ubuntu 20.04安装显卡驱动、CUDA、Pytorch(2024.06最新)

文章目录 一、安装显卡驱动1.1 查看显卡型号1.2 根据显卡型号选择驱动1.3 获取下载链接1.4 查看下载的显卡驱动安装文件1.5 更新软件列表和安装必要软件、依赖1.6 卸载原有驱动1.7 禁用默认驱动1.8 安装lightdm显示管理器1.9 停止显示服务器1.10 在文本界面中,禁用X…

关于新零售的一些思考

本文作为2024上半年大量输入之后的核心思考之一。工作到一定阶段之后,思考的重要性越来越高,后续会把自己的个人思考记录在这个新系列《施展爱思考》。背景是上半年面临业务转型从电商到新零售,本文是相关大量输入之后的思考,对新…

浅析Resource Quota中limits计算机制

前言 在生产环境中,通常需要通过配置资源配额(Resource Quota)来限制一个命名空间(namespace)能使用的资源量。在资源紧张的情况下,常常需要调整工作负载(workload)的请求值&#xf…

生信实证系列Vol.15:如何用AlphaFold2,啪,一键预测100+蛋白质结构

"结构就是功能"——蛋白质的工作原理和作用取决于其3D形状。 2020年末,基于深度神经网络的AlphaFold2,一举破解了困扰生物学界长达五十年之久的“蛋白质折叠”难题,改变了科学研究的游戏规则,可以从蛋白质序列直接预测…

MySQL高级-索引-使用规则-前缀索引

文章目录 1、前缀索引2、前缀长度3、查询表数据4、查询表的记录总数5、计算并返回具有电子邮件地址(email)的用户的数量6、从tb_user表中计算并返回具有不同电子邮件地址的用户的数量7、计算唯一电子邮件地址(email)的比例相对于表…

Spring Cloud Alibaba之声明式服务调用框架OpenFeign

实例演示1&#xff1a;使用OpenFeign调用服务 基于nacos的服务提供者&#xff1a; 创建SimpleOpenFeign的maven项目&#xff0c;添加pom依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

MySQL中Explain执行计划各参数的含义

EXPLAIN 语句输出的各个列的作用先大致罗列一下&#xff1a; 列名 描述 id 在一个大的查询语句中每个SELECT关键字都对应一个唯一的id select_type SELECT关键字对应的那个查询的类型 table 表名 partitions 匹配的分区信息 type 针对单表的访问方法 possible_keys…

VR加密方案常见问题有哪些?

在数字化时代&#xff0c;随着虚拟现实&#xff08;VR&#xff09;技术的迅速发展与普及&#xff0c;VR视频内容的安全传输成为关注焦点。为保护版权及敏感信息免遭非法复制或篡改&#xff0c;VR视频加密技术显得尤为重要。 首先&#xff0c;高效的加密算法对确保数据安全性至关…

动态流体工厂大屏

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 动态流体工厂大屏 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Task.Run(() >{while (true){this.Invoke(() >…

Linux之prometheus安装和使用简介(一)

一、prometheus简介 普罗米修斯Prometheus是一个开源系统监控和警报工具包&#xff0c;最初构建于SoundCloud。自2012年成立以来&#xff0c;许多公司和组织都采用了普罗米修斯&#xff0c;该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目&#xff0c;独立…

正则表达式详解及应用

正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;简称正则&#xff0c;是一种用于匹配字符串中字符组合的模式。它广泛应用于字符串查找、替换、数据验证等任务中。在Java中&#xff0c;正则表达式的支持由java.util.regex包提供。本文将详细介绍正则表达式的…