MYSQL查询语句执行顺序
SQL语句定义的顺序
(1) SELECT
(2)DISTINCT <select_list>
(3) FROM <left_table>
(4) <join_type> JOIN <right_table>
(5) ON <join_condition>
(6) WHERE <where_condition>
(7) GROUP BY <group_by_list>
(8) WITH {CUBE|ROLLUP}
(9) HAVING <having_condition>
(10) ORDER BY <order_by_condition>
(11) LIMIT <limit_number>
SQL语句执行顺序
(8) SELECT
(9)DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE|ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
(11) LIMIT <limit_number>
共十一个步骤,最先执行的是FROM操作,最后执行的是LIMIT操作。每个操作都会产生一个虚拟表,该虚拟表作为下一次处理的输入。
具体执行步骤
1-FROM 执行笛卡尔积
对FROM子句中的左表<left_table>和右表<right_table>执行笛卡儿积(交叉联接),生成虚拟表VT1,获取不同数据源的数据集。
FROM子句执行顺序为从后往前、从右到左,FROM 子句中写在最后的表(基础表 driving table)将被最先处理,即最后的表为驱动表,当FROM 子句中包含多个表的情况下,我们需要选择数据最少的表作为基础表。
2-ON 应用ON过滤器
对虚拟表VT1 应用ON筛选器,ON 中的逻辑表达式将应用到虚拟表 VT1中的各个行,只有那些符合<join_condition>的行才会被筛选,生成虚拟表 VT2 。
3-JOIN 添加外部行
如果指定了OUTER JOIN保留表中未找到匹配的行将作为外部行添加到虚拟表 VT2,生成虚拟表 VT3。保留表如下:
- LEFT OUTER JOIN把左表记为保留表
- RIGHT OUTER JOIN把右表记为保留表
- FULL OUTER JOIN把左右表都作为保留表
在虚拟表 VT2表的基础上添加保留表中被过滤条件过滤掉的数据,非保留表中的数据被赋予NULL值,最后生成虚拟表 VT3。
如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1~3,直到处理完所有的表为止。
4-WHERE 应用WEHRE过滤器
对虚拟表 VT3应用WHERE筛选器。根据指定的条件对数据进行筛选,只有符合<where_condition>的记录才会插入虚拟表 VT4。
- 由于数据还没有分组,因此现在还不能在WHERE过滤器中使用聚合函数对分组统计的过滤。
- 同时,由于还没有进行列的选取操作,因此在SELECT中使用列的别名也是不被允许的。
5-GROUP BY 分组
按GROUP BY子句中的列/列表将虚拟表 VT4中的行唯一的值组合成为一组,生成虚拟表VT5。如果应用了GROUP BY,那么后面的所有步骤都只能得到的虚拟表VT5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。
同时,从这一步开始,后面的语句中都可以使用SELECT中的别名。
6-WITH 应用ROLLUP或CUBE
对虚拟表 VT5应用ROLLUP或CUBE选项,生成虚拟表 VT6。
CUBE 和 ROLLUP 区别如下:
- CUBE 生成的结果数据集显示了所选列中值的所有组合的聚合。
- ROLLUP 生成的结果数据集显示了所选列中值的某一层次结构的聚合。
7-HAVING 应用HAVING过滤器
对虚拟表VT6应用HAVING筛选器。根据指定的条件对数据进行筛选,只有符合<having_condition>的记录才会插入虚拟表VT7。
HAVING 语句在SQL中的主要作用与WHERE语句作用是相同的,但是HAVING是过滤聚合值,在 SQL 中增加 HAVING 子句原因就是,WHERE 关键字无法与聚合函数一起使用,HAVING子句主要和GROUP BY子句配合使用。
8-SELECT 选出指定列
将虚拟表 VT7中的在SELECT中出现的列筛选出来,并对字段进行处理,计算SELECT子句中的表达式,产生虚拟表 VT8。
9-DISTINCT 行去重
将重复的行从虚拟表 VT8中移除,产生虚拟表 VT9。DISTINCT用来删除重复行,只保留唯一的。
10-ORDER BY 排列
将虚拟表 VT9中的行按ORDER BY 子句中的列/列表排序,生成游标 VC10 ,注意不是虚拟表。因此使用 ORDER BY 子句查询不能应用于表达式。同时,ORDER BY子句的执行顺序为从左到右排序,是非常消耗资源的。
11-LIMIT/OFFSET 指定返回行
从VC10的开始处选择指定数量行,生成虚拟表 VT11,返回给调用者。
相关文章:
MYSQL查询语句执行顺序
SQL语句定义的顺序 (1) SELECT (2)DISTINCT <select_list> (3) FROM <left_table> (4) <join_type> JOIN <right_table> (5) ON <join_condition> (6) WHERE <where_condition> (7) GROUP BY <group_by_list> (8) WITH {C…...
总结:电容在电路35个基本常识
1 电压源正负端接了一个电容,与电路并联,用于整流电路时,具有很好的滤波作用,当电压交变时,由于电容的充电作用,两端的电压不能突变,就保证了电压的平稳。 当用于电池电源时,具有交流…...
Kroger EDI 855 采购订单确认报文详解
本文着重讲述Kroger EDI项目中,供应商发给Kroger的X12 855EDI 规范报文(采购订单确认)解读。 在此前的文章如何读懂X12报文中,我们对X12已经做了详细的介绍,大家可以以此为基础,深入了解855采购订单确认报…...
HANA SDA-远程数据源访问
我们需要把其他系统的数据拿过来,到BW里和财务的数据集成。 HANA SDA就是不复制数据,建立虚拟表(virtual table)来映射到远程数据源。通过这个虚拟表访问其他系统的数据。 对虚拟表的操作现在也可以查询,更新ÿ…...
【AUTOSAR】:OS-Hook
OS-Hook OS-HookPINIC类型1、Os_ErrKernelPanic1.1、Os_HookCallPanicHook1.1.1、OS_PANICHOOK1.1.1.1、Os_PanicHook1.1.1.2、Os_Hal_CoreFreezeOs_Hal_NOPOS-Hook 延伸阅读 延伸阅读 PINIC类型 1、Os_ErrKernelPanic...
Open3d入门
目录 点云数据 1 主成分分析 1.1 Method 1.2 Results 2 表面法线估计 2.1 Method 2.2 Results 3 体素网格下采样 3.1 Method 3.2 Results 点云数据 常用数据下载(免积分) 1 主成分分析 1.1 Method 对点云进行主成分分析(PCA&…...
linux部署zookeeper
linux部署zookeeper 1、单机部署zk ZooKeeper服务器是用Java创建的,它需要在JVM上运行,所以需要使用JDK1.6及以上版本,一般都是jdk1.8。 选择自己安装本地的jdk,而不是centos自带的openjdk。 查看本地安装的jdk: j…...
Junit4升级Junit5汇总
Junit4升级Junit5汇总目录MockMvcBuildersUnnecessaryStubbingException目录 记录Junit4升级到Junit5中遇到的问题和结局方案 MockMvcBuilders 问题: 将Junit4的RunWith和Rule都改成ExtendWith后出现setup函数中MockMvcBuilders的参数不正确 ExtendWith({Spring…...
Axios二次封装和Api的解耦
目录 一、axios三种基本写法 二、axios的二次封装 三、Api的解耦 一、axios三种基本写法 1)get方法(是最简单的): 写法二: 2)post: 3)axios请求配置 默认是get请求,如…...
SpringAOP从入门到源码分析大全,学好AOP这一篇就够了(一)
文章目录系列文档索引一、认识AOP1、AOP的引入原因2、AOP常见使用场景日志场景统计场景安防场景性能场景3、AOP概念AOP 的概念Aspect 概念(切面)Join point 概念(连接点)Pointcut 概念(切入点)Advice 概念&…...
【单目标优化算法】樽海鞘群算法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
手把手教你,解决C盘分区不足,C盘怎么扩大磁盘分区
由于在磁盘分区中,C盘是很重要的一个磁盘,为了保证C盘有足够的磁盘分区。其中扩大C盘分区很常见的操作之一。那么,C盘怎么扩大磁盘分区?在本文中,易我小编将全面地讲解C盘合并分区的方法。 一、为什么C盘怎么扩大磁盘分…...
Ethernet-APL——过程自动化的新黄金标准
| Ethernet-APL为终客户和设备制造商带来益处 Ethernet-APL(Advanced Physical Layer,高级物理层)是一种两线制以太网物理层,它使用了由IEEE 802.3cg所定义的10BASE-T1L,并采用了新的工艺制造规定,因此构成…...
LVGL Styles
LVGL StylesGet started按钮添加标签按钮添加风格滑动条值显示StylesSize stylesBackground stylesBorder stylesOutline stylesShadow stylesImage stylesArc stylesText stylesLine stylesGet started 按钮添加标签 /*** brief 按钮事件回调函数* param e */ void btn_eve…...
扬帆优配|联通港股创近两年新高!A股资源类股爆发,食品饮料领跌
今日上午,A股商场和港股商场均现较大起伏震动,临近上午收盘出现一波跳水,不过,到上午收盘,上证指数仍微涨0.10%,煤炭等资源类板块明显上涨。 港股商场上午走弱,科技股领跌。 沪指微涨0.10%资源…...
Win10+VS2019+Qt5.15.2下编译QCAD
一:官方说法:WindowsDownload and install a C compiler, for example:Visual Studio C Express or Visual Studio CommunityDownload and install Qt from qt.io (see supported platforms):Download for example the online installer fileqt-opensour…...
【微信小程序】原生微信小程序ts模板下引入vant weapp
之前一直是在普通项目下使用 vant weapp,这不最近学了ts,使用微信开发工具的tsless初始化项目,再引入 vant 时踩了好久坑,特来记录一下 前言 本文章适合微信开发工具的ts项目,指的是项目目录结构如下图 总结 从上图…...
Puppeteer之Pyppeteer——自动登录Gmail(6)
前言 本文是该专栏的第6篇,结合项目案例让你熟练使用pyppeteer,后面会持续分享Pyppeteer的干货知识,记得关注。 有同学留言,使用selenium自动登录gmail邮箱,被Google识别为机器人怎么办?出现这个问题,主要在于Google可以检测出selenium的控件,无论你怎么加入规避方法,…...
python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()]
python 绘图 —— 绘制从顶部向底部显示的柱形图[ax.bar()] 效果图如下所示: 就是这个样子,一般比较少见将柱形图从上往下绘制的。可能是会为了更好的展示数据对比结果吧。这里绘图的主要思路如下: 利用ax.twinx()这个函数生成一个新的x轴…...
自定义Task工具,调用系统的IdleHandler方法
1、工具类,调用系统的IdleHandler方法package com.abbi.viewdemo;import android.os.Looper;import android.os.MessageQueue;import java.util.LinkedList;import java.util.Queue;public class DelayTaskDispatcher {private Queue<Task> delayTasks new L…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
