SQL语句执行顺序

文章目录

  • SQL 简介
  • SQL 语句的执行顺序
  • 重点

SQL 简介

SQL 是 Structured Query Language 的缩写,称为结构化查询语言,SQL 是一种操作关系型数据库的规则,SQL 语句以分号结尾,不区分大小写,建议关键词使用大写。

SQL 语句的执行顺序

(7) SELECT
(8) 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) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
在这里插入图片描述

下面我们来具体分析一下查询处理的每一个阶段:

FORM:FROM 的左边的表和右边的表计算笛卡尔积。产生虚拟表 VT1

ON: 对虚拟表 VT1 进行 ON 筛选,只有那些符合 <join-condition> 的行才会被记录在虚拟表 VT2 中。

JOIN: 如果指定了 OUTER JOIN(比如 left joinright join),那么保留表中未匹配的行就会作为外部行添加到虚拟表 VT2 中,产生虚拟表 VT3, 如果 from 子句中包含两个以上的表的话,那么就会对上一个 join 连接产生的结果 VT3 和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。

WHERE: 对虚拟表 VT3 进行 WHERE 条件过滤。只有符合 <where-condition> 的记录才会被插入到虚拟表 VT4 中。

GROUP BY: 根据 group by 子句中的列,对 VT4 中的记录进行分组操作,产生虚拟表 VT5

CUBE | ROLLUP: 对表 VT5 进行 cube 或者 rollup 操作,产生虚拟表 VT6

HAVING: 对虚拟表 VT6 应用 having 过滤,只有符合 <having-condition> 的记录才会被 插入到虚拟表 VT7 中。

SELECT: 执行 select 操作,选择指定的列,并对字段进行处理,计算 select 子句中的表达式,产生虚拟表 VT8

DISTINCT:VT8 中的记录进行去重。产生虚拟表 VT9

ORDER BY: 将虚拟表 VT9 中的记录按照 <order_by_list> 进行排序操作,返回游标 VC10,而不是虚拟表。SQL 是基于集合理论的,集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询可以返回一个对象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。正因为返回值是游标,那么使用 ORDER BY 子句查询不能应用于表表达式。排序是很需要成本的,除非你必须要排序,否则最好不要指定 ORDER BY。这一步是第一步也是唯一一步可以使用 SELECT 列表中的列别名的步骤。

LIMIT:VC10 的开始处选择指定数量行,生成虚拟表 VT11,并将结果返回。

写的顺序:

select ... from... where.... group by... having... order by.. limit...

执行顺序:

from... where...group by... having.... select ... order by... limit... 

重点

错误的理解:

select … where,where 子句比 selec 子句先执行,但是数据库是逐行判断的,也就是说数据库在执行 SQL 语句时,指针会移动到表中的第一行,先判断第一行记录是否满足 where 子句的条件,满足则执行 select 子句,将整行记录的所有字段值存储到虚拟表中(注意:如果 select 子句中自定义了其它字段,那么这个步骤会将自定义的字段及相关的字段值存储到虚拟表中)。接着移动指针到下一行,再判断是否满足 where 子句的条件;如果不满足则放弃该条记录,接着指针移到下一行,再判断是否满足 where 子句的条件。重复上述的流程直到无记录可读取为止。

但是最终在返回查询结果时,selec 子句指定了什么字段,返回的结果集中则包含哪些字段。

正确的理解:

先逐行判断记录是否满足 where 子句的条件,不满足则放弃,满足则将整行记录的字段值存储到虚拟表 VT0 中,直到整张表的数据筛选完成后,再执行 select 子句从虚拟表 VT0 中获取指定的列和值到虚拟表 VT1 中,最后将结果返回。

如果 select 子句中含有变量表达式,在执行 where 子句时,有时候这些表达式会同步进行计算,而有的时候不会计算,具体什么情况下会计算,什么情况下不会计算,我也不清楚。但是这里要提醒的是,即便表达式同步计算了,并不表示 select 子句在执行,所以不要以为变量的值发生变化了就认为 where 子句执行完后紧跟着就执行了 select 子句,其实并不是这样的。

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

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

相关文章

getexternalfilesdir 相册_音乐相册(电子相册制作)V5.2 安卓最新版

音乐相册(电子相册制作)是一个功能强大的电子相册创建工具。最新版本的音乐专辑应用程序可以帮助用户快速创建精美的多媒体专辑视频&#xff0c;并匹配优美的音乐伴奏&#xff0c;使照片更精彩。音乐专辑应用程序支持几乎所有流行的图片格式&#xff0c;并支持导入和导出&#…

二级java题型及分值_2016年全国计算机二级java语言程序设计考试大纲

2016年全国计算机二级java语言程序设计考试大纲2016年3月计算机考试即将在3月26日-29日进行&#xff0c;为了帮助大家顺利通过2016年计算机二级考试&#xff0c;下面百分网小编为大家带来2016年全国计算机二级java语言程序设计考试大纲&#xff0c;供大家参考学习&#xff0c;预…

linux系统下安装jdk教程

一、首先下载linux版本jdk jdk官网&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 根据自己的需求&#xff0c;下载不同版本的jdk 2.将下载好的jdk压缩包&#xff0c;通过ftp上传到linux系统的当前用户下&#xff0c;我当前登录的用户为r…

iphone11什么时候上市_hd3手表高仿哪里买 什么时候上市?

hd3手表高仿哪里买 什么时候上市? 导读&#xff1a;hd3手表高仿哪里买zf的万国7日链高仿表怎么样&#xff1f;款式设计非常出色&#xff0c;很多手表的款式&#xff0c;依靠着该性价比的迅速提升来做出的有效转化&#xff0c;年轻人对于复刻表的选择&#xff0c;能拥有的这些细…

Windows 命令终端(CMD)程序员常用的命令

文章目录certutilcddirmd/mkdirrddelreplacechdir/cdattribhelptypemorefindstrrename/renset环境变量扩展echonetstattskilltasklisttaskkillnettreecopystartpauseprintverwinversysteminfowmiclogofftracertroute printtelnetftppingipconfigshutdown远程关机formatchkdskti…

驱动级的自动按键_空调遥控器特殊按键使用方法及注意事项

在上门维修过程中&#xff0c;用户常常由于遥控器使用不当&#xff0c;或者幵启了特定按键引起空调器的假性故障&#xff0c;这时需要进行电话解答或上门讲解&#xff0c;现对空调遥控器的特殊功能按键作简单介绍。示例遥控器型号为格力YAD0F,与KFR-23GW/ ( 23570 ) Aa-3挂式空…

净资产滚动率_净资产的结构

净资产滚动率Netty的包装结构很棒。 每个程序员都应该研究它。 每个系统都应该模仿它&#xff1b; 每个项目经理都应将其打印出来&#xff0c;拍在墙上&#xff0c;然后对开发人员说&#xff1a;“那样。” Netty是一个“ ...异步事件驱动的网络应用程序框架&#xff0c;用于…

Java从键盘输入若干数_用java编程序:从键盘输入若干个整数,输出这些数中大于其平均值的数。...

展开全部引用1楼 christal yhy的答案,考虑到浮点数的存在,特在此基础上优化一下,代码如下:public static void main(String[] args) {Scanner scan new Scanner(System.in);System.out.println("请输入62616964757a686964616fe59b9ee7ad9431333262373933要输入的个数:&qu…

java多线程编程_阿里P8熬到秃头肝出来的:Java多线程+并发编程核心笔记

自学Java的时候&#xff0c;多线程和并发这一块可以说是最难掌握的部分了&#xff0c;很多小伙伴表示需要一些易于学习和上手的资料。所以今天这本「Java并发学习手册.pdf」就是一份集中学习多线程和并发的手册&#xff0c;PDF版&#xff0c;由RedSpider社区的五位大神撰写&…

内外网逻辑隔离物理隔离_隔离域逻辑

内外网逻辑隔离物理隔离在一个设计模式课程中&#xff0c;我对建模域逻辑进行了有趣的讨论。 具体来说&#xff0c;它是关于隔离域逻辑的 。 一个应用程序通常分为三个部分&#xff1a; 演示&#xff08;例如桌面GUI&#xff0c;浏览器&#xff0c;Web服务&#xff09; 域逻辑…

360安全浏览器兼容模式怎么设置_测试新手一定要知道:最实用的Web兼容性测试经验都在这...

在日常工作中&#xff0c;我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试&#xff0c;目的在于保证待测试项目在不同的操作系统平台上正常运行。主要包括待测试项目能在同一操作系统平台的不同版本上正常运行&#xff1b;待测试项目能与相关的其他软件或系统的“和平…

HTML 中的节点、元素、标签、标记的区别

文章目录一、HTML 节点&#xff08;一&#xff09;节点的类型二、HTML 标签三、HTML 元素&#xff08;一&#xff09;HTML 元素属性&#xff08;二&#xff09;HTML 元素的嵌套一、HTML 节点 节点&#xff08;node&#xff09;是构成我们网页的最基本的组成部分&#xff0c;网…

cpu占用100_Java项目服务器cpu占用100%解决办法

1、使用命令top查看cpu进程&#xff0c;发现tomcat占用cpu使用率过高可以看到服务器负载很高&#xff0c;tomcat CPU使用已达到接近300%,内存20%。2、把进程的栈dump到文件里&#xff0c;以便后面的分析jstack 22764 > cpu0827.log 3、看看这个进程里面哪些线程在占用cputop…

apm java_非Java专家的APM:什么泄漏?

apm java通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用&#xff01; 内存&#xff0c;内存&#xff0c;内存... 内存是Java的关键部分&#xff0c;尤其是内存管理。 作为开发人员&#xff0c;内存管理不是您想…

360安全卫士电脑版_教你降服“流氓头子”正确打开360安全卫士的姿势,还你电脑流畅体验...

最近老哥家的电脑经常出问题原因是熊孩子玩儿完电脑&#xff0c;最后总是一堆莫名其妙的流氓软件占据桌面的半壁江山然后恢复电脑流畅运行的任务&#xff0c;就交到我这个“懂电脑”的人手里。如此反复两次&#xff0c;脾气再好的人&#xff0c;也想拉着熊孩子打一顿。但是活儿…

信封问题_装饰信封

信封问题有时 很多时候&#xff0c;我需要一个类实现通过使其他类的实例的接口。 听起来很奇怪&#xff1f; 让我给你看一个例子。 在Takes框架中有许多此类&#xff0c;它们的名称都都类似于*Wrap 。 不幸的是&#xff0c;这是一个方便的设计概念&#xff0c;在Java中看起来很…

etf基金代码大全_银行ETF最新规模首超28亿元再创历史新高,近4个月资金净流入超12亿元...

2019年即将收官&#xff0c;A股大盘在12月份总体有了明显的回暖&#xff0c;拥有低估值优势的银行板块随之明显反弹。受此利好行情催化&#xff0c;资金持续涌入银行ETF&#xff0c;其基金份额、基金规模双双连创历史新高。据上交所12月26日公布的最新数据&#xff0c;银行ETF&…

java判断时间是否在时间段内_具有C语言基础,利用半年时间学习Java是否够用

首先&#xff0c;对于具有一定C语言基础的同学来说&#xff0c;利用半年的时间来学习Java会有一个比较系统的学习过程&#xff0c;通常也能够达到实习程序员&#xff0c;或者是助理程序员的水平&#xff0c;然后在技术团队中实践一段时间之后&#xff0c;从事专业开发岗位应该是…

二维动画作品_「咻动画」二维动画制作中角色造型的设计要点

关于二维动画可能就算不是动画行业的小伙伴们都多多少少都有所了解&#xff0c;近年来其在宣传片制作上面越来越受用。不少企业抛开传统保守的宣传片表现形式转而尝试动画制作宣传片&#xff0c;我们都知道在动画制作从脚本策划到输出成片这个过程中是一个很复杂的制作流程&…

c# redis 如何设置过期时间_Redis 过期时间与内存管理

http://www.redis.cn/commands/expire.htmlhttp://www.redis.cn/topics/lru-cache.html内存管理 当 Redis 作为缓存使用时&#xff08;此时缓存仅作为热点数据提高服务的访问性能&#xff09;&#xff0c;需要考虑内存的限制&#xff0c;以及如何随着业务的增长&#xff0c;仅保…