MySQL中SQL的执行顺序

MySQL中SQL的执行顺序

在日常的开发工作中,我们经常会自己手写一些sql语句,但是对于这些sql语句是怎么执行的,执行的顺序又是怎么样的呢?想必各位大佬对此也是了解的,所以对sql语言的执行顺序有一定的了解的话,会更好的理解一些sql语句,从而更好的写sql语句,也有助于SQL的调优。就比如说,先使用子查询对数据进行过滤后在进行join操作还是直接使用join操作之后,再进行数据过滤。

SQL执行顺序

下面是一条我们经常会用到也经常会手写的一条sql语句。

select distinct查询列表(要查的字段),max(), avg().... 聚合函数
from左边的表们s
连接类型(left|inner) join 右边的表们s
on 连接条件
where筛选条件
group by分组的列表(按什么字段分组)
havinghaving_condition
order by排序的字段
limitpageSize

下面是sql语句的执行顺序

语法格式语法含义执行顺序
select查询语句8
distinct去重9
sum(), avg()…聚合函数6
from tableA主表1
join tableB连接3
on连接条件2
where过滤条件4
group by分组5
havinghaving条件7
order by排序10
limit分页11

查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入

  1. 首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表 vt1(选择相对小的表做基础表)。

  2. 接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2 。

  3. 如果是outer join 那么这一步就将添加外部行,left outer jion 就把左表在第二步中过滤的添加进来,如果是right outer join 那么就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 vt3 。

  4. 如果 from 子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3。

  5. 应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4。

    注意where与on的区别:先执行on,后执行where;on是建立关联关系在生成临时表时候执行,where是在临时表生成后对数据进行筛选的。

  6. group by 子句将中的唯一的值组合成为一组,得到虚拟表vt5。如果应用了group by,那么后面的所有步骤都只能得到的vt5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。这一点请牢记。

  7. 应用avg或者sum选项,为vt5生成超组,生成vt6.

  8. 应用having筛选器,生成vt7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。

  9. 处理select子句。将vt7中的在select中出现的列筛选出来。生成vt8.

  10. 应用distinct子句,对vt8进行去重,生成vt9。

  11. 应用order by子句。按照order_by_condition排序vt9,此时返回的一个游标,而不是虚拟表。

  12. 应用limit选项。生成vt10返回结果给请求者即用户。

MySQL的执行顺序

1、SELECT语句定义
一个完整的SELECT语句包含可选的几个子句。SELECT语句的定义如下:

<SELECT clause> 
[<FROM clause>] 
[<WHERE clause>] 
[<GROUP BY clause>] 
[<HAVING clause>] 
[<ORDER BY clause>] 
[<LIMIT clause>] 
SELECT子句是必选的,其它子句如WHERE子句、GROUP BY子句等是可选的。 
一个SELECT语句中,子句的顺序是固定的。例如GROUP BY子句不会位于WHERE子句的前面。 

2、SELECT语句执行顺序
SELECT语句中子句的执行顺序与SELECT语句中子句的输入顺序是不一样的,所以并不是从SELECT子句开始执行的,而是按照下面的顺序执行:

开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->SELECT子句->ORDER BY子句->LIMIT子句->最终结果

每个子句执行后都会产生一个中间结果,供接下来的子句使用,如果不存在某个子句,就跳过
对比了一下,MySQL和sql执行顺序基本是一样的, 标准顺序的 SQL 语句为:

select empName, max(salary) as maxSalary from t_emp where empName is not null group by empName having max(salary) > 2000 order by maxSalary

在上面的示例中 SQL 语句的执行顺序如下:

(1). 首先执行 FROM 子句, 从 t_emp 表组装数据源的数据

(2). 执行 WHERE 子句, 筛选 t_emp 表中所有数据不为 NULL 的数据

(3). 执行 GROUP BY 子句, 把 t_emp 表按 empName 列进行分组

​ (注:这一步开始才可以使用select中的别名,他返回一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用)

(4). 计算 max() 聚集函数, 按 maxSalary 求出总薪酬中最大的一些数值

(5). 执行 HAVING 子句, 筛选员工的总薪酬大于 2000的.

(7). 执行 ORDER BY 子句, 把最后的结果按 maxSalary 进行排序.

参考:https://blog.csdn.net/u014044812/article/details/51004754?spm=1001.2014.3001.5506

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

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

相关文章

【SQL|大数据|数据清洗|过滤】where条件中 “ != “ 和 “ NOT IN() ” 对NULL的处理

对数据进行清洗过滤的时候&#xff0c;NULL往往是一个很特殊的存在&#xff0c;对NULL值的存在通常有以下三种方式 1、保留NULL 2、过滤掉NULL 3、将NULL替换为其他符合业务需求的默认常量 下面是一些常用处理NULL的方式&#xff1a; 如下图所示数据源&#xff1a; car_vin&…

天锐绿盾与Ping32内网安全保护能力对比,选择最优方案

在数字化时代&#xff0c;企业内网安全面临着越来越多的挑战。有效保护内网数据安全&#xff0c;防止信息泄露和外部攻击至关重要。今天&#xff0c;我们将对比天锐绿盾和Ping32这两款内网安全保护软件&#xff0c;帮助您选择最适合的解决方案。 1. 安全防护机制 Ping32 Ping…

熔解曲线技术路线简介

在实时荧光定量PCR&#xff08;qPCR&#xff09;实验中&#xff0c;当双链DNA受热时&#xff0c;其互补碱基之间的氢键会逐渐断裂&#xff0c;导致双链分离成两条单链&#xff0c;这一过程被称为DNA的“熔解”。 总的DNA双螺旋结构降解一半的温度称为熔解温度&#xff08;Tm&a…

pytorch nn.NLLLoss和nn.CrossEntropyLoss函数区别

nn.CrossEntropyLoss(交叉熵损失函数) 和nn.NLLLoss (负对数似然损失函数)的区别 输入格式: nn.CrossEntropyLoss:直接接受未归一化的 logits 作为输入,并在内部自动应用 log_softmax 来计算对数概率。nn.NLLLoss:接受对数概率(log-probabilities)作为输入,也就是说,输…

游戏推荐业务中基于 sentinel 的动态限流实践

作者&#xff1a;来自 vivo 互联网服务器团队- Gao Meng 本文介绍了一种基于 sentinel 进行二次开发的动态限流解决方案&#xff0c;包括什么是动态限流、为什么需要引入动态限流、以及动态限流的实现原理。 一、背景 1.1 当前的限流方案 随着互联网的发展及业务的增长&…

python基础综合案例(数据可视化-地图可视化)

1.基础地图使用 注意写名字的时候要写全名&#xff0c;比如上海市不能写出上海&#xff0c;不然看不到数据 鼠标点击即可看到数据 设置属性的时候不要忘记导包 # 演示地图可视化的基础使用 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts # 准…

C语言入门-选择结构

在编程中&#xff0c;我们经常需要根据不同的条件执行不同的操作。C语言为此提供了几种非常实用的选择结构&#xff1a;条件运算符、逻辑运算、if语句和switch语句。接下来&#xff0c;让我们深入探讨这些重要的知识点&#xff0c;帮助你更好地理解和掌握C语言的选择结构。 1.…

MongoDB安装配置及配置和启动服务

MongoDB 安装配置 附&#xff1a;MongoDB官网下载地址&#xff1a; https://www.mongodb.com/download-center/community 注&#xff1a; 官网可以下载最新版的MongoDB安装包&#xff0c;有MSI安装版和ZIP安装版。我们课堂上使用4.4.4的ZIP安装版。安装版参考博客&#xff1…

k8s 使用 containerd 作为容器运行时拉取 http 的 harbor 私有仓库镜像

文章目录 [toc]版本介绍报错内容解决方法主配置文件修改创建镜像仓库配置 备注 版本介绍 k8s&#xff1a;v1.28.2containerd&#xff1a;1.6.33 报错内容 我的 harbor 用的是 http 的&#xff0c;因为是内网自己用&#xff0c;就没有配置 https 了&#xff0c;于是配置好镜像拉…

JavaScript 在网页设计中的四大精彩案例:画布时钟、自动轮播图、表单验证与可拖动元素

在网页开发中&#xff0c;JavaScript 发挥着至关重要的作用&#xff0c;为网页带来丰富的交互性和动态效果&#xff0c;极大地提升了用户体验。本文将通过几个具体案例展示 JavaScript 的强大魅力。 一、美丽的画布时钟 这是一个使用 JavaScript 在网页上创建美丽画布时钟的案…

Pytorch Note

cat函数: cat函数不会增加维度&#xff0c;默认按照dim0连接张量 stack函数: stack函数会增加一个维度 nn.Linear的默认输入: torch中默认输入一定要为tensor&#xff0c;并且默认是tensor.float32&#xff0c;此外device如果没有model.to(device)放到gpu上面默认会在cpu上运…

RabbitMQ系列学习笔记(十)--通配符模式

文章目录 一、通配符模式原理二、通配符模式实战1、消费者代码2、生产者代码3、查看运行结果 本文参考&#xff1a; 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、通配符模式原理 通配符模式&#xff…

2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP

文章目录 一、前言二、MICS你是黑客么循环的压缩包Goodtime 三、WEBpy 四、Crypto变异凯撒RSAcrypto3 一、前言 WP不完整&#xff0c;仅供参考&#xff01; 除WEB&#xff0c;RE&#xff0c;PWN外&#xff0c;其余附件均已打包完毕 也是一个对MISC比较友好的一个比赛~ 123网…

写了一个SpringBoot的后端管理系统(仅后端)pine-manage-system

文章目录 前言正文&#x1f680; 技术栈&#x1f6e0;️ 功能模块&#x1f4c1; 项目结构&#x1f308; 接口文档&#x1f680; 项目启动 附录项目功能代码示例1、数据库拦截器-打印sql执行时间2、数据记录变更拦截器3、用户角色数据权限拦截器4、实体转换器接口5、触发器模版6…

自动驾驶合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12304421 #NeRF与自动驾驶 神经辐射场&#xff08;Neural Radiance Fields&#xff09;自2020年被提出以来&#xff0c;相关论文数量呈指数增长&#xff0c;不但成为了三维重建的重要分支方向&#xff0c;也逐渐作为自动驾驶…

C++学习笔记----9、发现继承的技巧(五)---- 多重继承(1)

我们前面提到过&#xff0c;多重继承常被认为是面向对象编程中复杂且没有必要的部分。这就仁者见仁&#xff0c;智者见智了&#xff0c;留给大家去评判。本节解释c中的多重继承。 1、多个类继承 从语法角度来说&#xff0c;定义一个有多个父类的类是很简单的。需要做的就是当声…

vue前端接包(axios)+ 前端导出excel(xlsx-js-style)

// 先在请求处加上&#xff1a; responseType: arraybuffer, // 指定响应类型为ArrayBufferconst data new Uint8Array(response.data); // 将ArrayBuffer转换为Uint8Arrayconst val { columns: [], data: [] }let offset 0; // 用于跟踪当前解析到的位置while (offset …

DASCTF 2024金秋十月赛RE题wp

目录 RE1&#xff1a;ezRERE2&#xff1a;ezelfRE3&#xff1a;ezAndroid 3题RE&#xff0c;差一点就AK了&#xff0c;可能好久没打比赛了&#xff0c;技能有所下降&#xff0c;还是需要经常摸一摸工具。 RE1&#xff1a;ezRE 执行的时候dump出来&#xff0c;然后静态分析 发…

深入理解Spring Boot的事务注解及其实现原理

深入理解Spring Boot的事务注解及其实现原理 在现代企业级应用开发中&#xff0c;事务管理是一个至关重要的概念。Spring Boot 提供了强大的事务管理功能&#xff0c;使得开发者可以轻松地管理数据库事务。本文将详细介绍Spring Boot中的事务注解及其实现原理。 1. 什么是事务…

Java项目-基于springboot框架的游戏分享系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…