sql执行顺序

sql执行顺序

        1.from

        2.on

        3.join

        4.where

        5.group by(开始使用select中的别名,后面的语句中都可以使用)

        6.avg,sum....

        7.having

        8.select

        9.distinct

        10.order by

        11.limit

从这个顺序中我们不难发现,所有的 查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。 

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

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

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

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

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

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

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

第七步:应用avg或者sum选项,为vt5生成超组,生成vt6. 
第八步:应用having筛选器,生成vt7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。 
第九步:处理select子句。将vt7中的在select中出现的列筛选出来。生成vt8. 

第十步:应用distinct子句,对vt8进行去重,生成vt9。

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

第十二步:应用limit选项。生成vt10返回结果给请求者即用户。 
 

select 考生姓名, max(总成绩) as max总成绩 from tb_Grade where 考生姓名 is not null group by 考生姓名 having max(总成绩) > 600 order by max总成绩 

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

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

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

   (3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用,感谢网友  zyt1369  提出这个问题)
   (4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值 

   (5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的. 

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

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

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

相关文章

rime中州韵小狼毫 Upper lua Filter 首字母大写滤镜

在 rime中州韵小狼毫 easyEnglish输入法 一文中, 我们定义了 easy-English 输入方案。输入效果如下👇: 我们知道,在英文世界中,单词有首字母大写的习惯,如果我们输入 english 单词后,再回来改…

力扣hot00 二叉树的中序遍历

👨‍🏫 题目地址 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left…

Qt6.5类库详解:QComboBox

哈喽大家好,欢迎关注公众号(20YC编程),有免费C视频课程哦! -今日内容- 1. QComboBox介绍 QComboBox是一个下拉列表框组件类,它提供了一个下拉列表供用户选择,也可以直接当作一个QLineEdit用作输入。 QComboBox除了显…

模糊查询导致索引失效怎么解决

模糊查询导致索引失效可能是由于模糊查询的特性,使得数据库引擎难以有效利用索引。以下是一些解决方法: 1、前缀索引: 如果你的模糊查询是以字符串的开头进行的,考虑使用前缀索引。前缀索引只包含列值的开头部分,可以…

探索 Vue 实例方法的魅力:提升 Vue 开发技能(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

关于Spring @Transactional事务传播机制详解

Spring事务传播机制 1.什么是事务传播机制?2.Spring事务传播类型Propagation介绍3.具体案例总结 Spring事务传播机制 1.什么是事务传播机制? 举个栗子,方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有…

微服务-OpenFeign-工程案例

Ribbon 前置知识 是NetFlix的开源项目,主要来提供关于客户端的负载均衡能力。从多个服务提供方,选取一个节点发起调用。 Feign:NetFlix,SpringCloud 的第一代LB(负载均衡)客户端工具包。 OpenFeign:SpringCloud自研&#xff0c…

什么是 NAS?

一、什么是 NAS? 在数字化时代,小型企业面临着日益增长的数据存储需求。为了应对这一挑战,网络附加存储(NAS)系统成为了许多企业的首选解决方案。NAS系统是一种连接到网络的存储设备,允许授权网络用户和异…

软件测试作业‖pytest+po+csv+html报告+cookie+selenium

软件测试作业‖pytestpocsvhtml报告cookieselenium 先用本地部署的系统试了下 或者UFT自动化测试里诺图书管理系统软件测试 # ,#测试报告# #性能测试#,#测试用例#, #自动化测试# Selenium 的 Web自动化测试基本要求和注意事项 1.请使用ch…

JRT控制打印机

本次测试打印机控制和纸张方向控制。 打印机状态 选择打印机 控制纸张 定义纸张 旋转纸张 不旋转纸张 A4

Oracle清理审计和监听垃圾文件脚本

Oracle用户删除审计文件自动化脚本 $(ORACLE) vi oracle_auto_trace_del.sh#!/bin/bash #ORACLE cd /opt/oracle/app/oracle/admin/SID(数据库实例名)/adump find . -type f -name "*.aud" -mtime 10 |xargs rm -rf$(ORACLE&#…

三、C语言中的分支与循环—goto语句 (10) (完)

在C语言中,goto语句允许程序无条件地跳转到同一函数内的标记位置。这个标记位置通过一个标签和冒号(:)来标示。goto语句可以用于从深层嵌套的循环或条件语句中直接跳出,或者跳过某些代码执行。尽管goto语句在某些情况下可以使程序逻辑变得清晰&#xff0…

C++中互斥量、锁有什么用?

文章目录 互斥量如何理解互斥量C 中互斥量的用法基本锁定和解锁使用 std::lock_guard 自动管理锁使用 std::unique_lock 获得更多控制 注意事项 几种不同类型的锁 创建一个C线程需要传入几个参数? 如何理解和使用C线程循环 C 类 函数 变量 进程 线程 C关于锁和互斥量…

Modbus 通信协议 二

Modbus 常用缩写 通用Modbus帧结构 -应用数据单元(ADU) Modbus数据模型 Modbus ADU 和 PDU 的长度 Modbus PDU结构 串行链路上的 Modbus 帧结构 Modbus 地址规则 ASCLL 模式 和 RTU 模式的比较 RTU 模式 RTU 模式位序列 帧格式 帧的标识与鉴别 CRC 循环冗…

openGauss学习笔记-183 openGauss 数据库运维-升级-升级操作

文章目录 openGauss学习笔记-183 openGauss 数据库运维-升级-升级操作183.1 就地升级和灰度升级操作步骤 openGauss学习笔记-183 openGauss 数据库运维-升级-升级操作 介绍就地升级、灰度升级和滚动升级的详细操作。 183.1 就地升级和灰度升级操作步骤 以root身份登录节点。 …

关于数据降维的几种方法

1.什么是数据降维? 数据降维是指将高维数据转化为低维数据的过程。在现实生活中,我们常常面临高维数据的问题,例如图像数据、文本数据、传感器数据等。高维数据在存储、处理和可视化方面都具有挑战性,而且可能导致过拟合问题。 …

如何使用LightsOut生成经过混淆处理的DLL

关于LightsOut LightsOut是一款功能强大的DLL生成工具,该工具可以帮助广大研究人员轻松生成经过混淆处理的DLL。该工具专为红队研究人员设计,生成的DLL可以在研究人员尝试绕过反病毒产品时禁用AMSI和ETW,从而更好地测试目标系统的安全性。 …

Gin 集成 prometheus 客户端实现注册和暴露指标

前言 当我们构建一个 Web 应用程序时,了解应用程序的性能和行为是非常重要的。Prometheus 是一个流行的开源监控系统,它提供了强大的指标收集和查询功能,可以帮助我们监控应用程序的各个方面。 在 Gin 中集成 Prometheus 可以让我们更方便地监…

Scrapy 1.3.0 使用简介

scrapy 1.3.0 python 2.7 创建一个项目: Before you startscraping, you will have to set up a new Scrapy project. Enter a directory whereyou’d like to store your code and run: scrapy startproject tutorial 然后就会得到一系列文件: 第一个爬…

使用Matplotlib绘制模拟上海城市气温变化图

模拟上海气温变化折线图 实现步骤 准备数据创建画布绘制图像显示图像 基本实现 示例代码: import matplotlib.pyplot as plt import random# 准备数据 x range(60) y_shanghai [random.uniform(15,18) for _ in x]# 创建画布 plt.figure(figure(20,8), dpi10…