mysql sql先后执行_MySQL中SQL语句执行顺序

(7) SELECT

(8) DISTINCT

(1) FROM

(3) JOIN

(2) ON

(4) WHERE

(5) GROUP BY

(6) HAVING

(9) ORDER BY

(10) LIMIT

前期准备工作

1、新建一个测试数据库

create database testData;

2、创建测试表,并插入数据如下:

用户表

b8cbf3c71d0fee5091358d733ad762df.png

订单表

984e8d4bb871881d672c97d5c857e770.png

准备SQL逻辑查询测试语句

SELECT a.user_id,COUNT(b.order_id) as total_orders

FROM  user as a

LEFT JOIN orders as b

ON a.user_id = b.user_id

WHERE a.city = 'beijing'

GROUP BY a.user_id

HAVING COUNT(b.order_id) < 2

ORDER BY total_orders desc

使用上述SQL查询语句来获得来自北京,并且订单数少于2的客户;

在这些SQL语句的执行过程中,都会产生一个虚拟表,用来保存SQL语句的执行结果

一、执行FROM语句

第一步,执行FROM语句。我们首先需要知道最开始从哪个表开始的,这就是FROM告诉我们的。现在有了和两个表,我们到底从哪个表开始,还是从两个表进行某种联系以后再开始呢?它们之间如何产生联系呢?——笛卡尔积

经过FROM语句对两个表执行笛卡尔积,会得到一个虚拟表,VT1(vitual table 1),内容如下:

1b02d35ec0cec4a6db3f101700587172.png

总共有28(user的记录条数 * orders的记录条数)条记录。这就是VT1的结果,接下来的操作就在VT1的基础上进行

二、执行ON过滤

执行完笛卡尔积以后,接着就进行ON a.user_id = b.user_id条件过滤,根据ON中指定的条件,去掉那些不符合条件的数据,得到VT2如下:

select * from user as a inner JOIN orders as b ON a.user_id = b.user_id;

3bae422c206f6023771c3c782d00b056.png

三、添加外部行

这一步只有在连接类型为OUTER JOIN时才发生,如LEFT OUTER JOIN、RIGHT OUTER JOIN和FULL OUTER JOIN。在大多数的时候,我们都是会省略掉OUTER关键字的,但OUTER表示的就是外部行的概念。

LEFT OUTER JOIN把左表记为保留表:即左表的数据会被全部查询出来,若右表中无对应数据,会用NULL来填充:

4ffc69194fab5362d89ae35cfa956ee1.png

RIGHT OUTER JOIN把右表记为保留表:即右表的数据会被全部查询出来,若左表中无对应数据,则用NULL补充;

4116ba36b0ca8ebd03b419cb776a8814.png

FULL OUTER JOIN把左右表都作为保留表,但在Mysql中不支持全连接,可以通过以下方式实现全连接:

select * from A left join B on A.id = B.id (where 条件)

union

select * from A right join B on A.id = B.id (where条件);

7ecdfad668bbbcc3aa726132ca4ba1ec.png

由于我在准备的测试SQL查询逻辑语句中使用的是LEFT JOIN,得到的VT3表如下:

f938e4059dfdd4a0be412cf13bb186e7.png

四、执行where条件过滤

对添加了外部行的数据进行where条件过滤,只有符合条件的记录会被筛选出来,执行WHERE a.city = 'beijing'得到VT4如下:

5fb55814620639b4f67d3cd82d779b84.png

但是在使用WHERE子句时,需要注意以下两点:

1、由于数据还没有分组,因此现在还不能在where过滤条件中使用where_condition=MIN(col)这类对分组统计的过滤;

2、由于还没有进行列的选取操作,因此在select中使用列的别名也是不被允许的,如:select  city as c from table1 wherec='beijing' 是不允许的

五、执行group by分组语句

GROU BY子句主要是对使用WHERE子句得到的虚拟表进行分组操作,执行GROUP BY a.user_id得到VT5如下:

9b30cdcd3dea5f0a3aaff562886f5770.png

六、执行having

HAVING子句主要和GROUP BY子句配合使用,对分组得到VT5的数据进行条件过滤,执行HAVING COUNT(b.order_id) < 2,得到VT6如下:

0bdc91ae4798276ec562ac814847d3fd.png

七、select列表

现在才会执行到SELECT子句,不要以为SELECT子句被写在第一行,就是第一个被执行的。

我们执行测试语句中的SELECT a.user_id,user_name,COUNT(b.order_id) as total_orders,从VT6中选择出我们需要的内容,得到VT7如下:

851ed9b573829fc259e33fc77780e552.png

八、执行distinct去重复数据

如果在查询中指定了DISTINCT子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。这张临时表的表结构和上一步产生的虚拟表是一样的,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来除重复数据。测试SQL中没有DISTINCT字句,所以不会执行

九、执行order by字句

对虚拟表VT7中的内容按照指定的列进行排序,然后返回一个新的虚拟表,我们执行测试SQL语句中的ORDER BY total_orders DESC ,得到结果如下:

DESC倒序排序,ASC升序排序

7ff0eb4c0223ee79dc1233bafe9ddf8f.png

十、执行limit字句

LIMIT子句从上一步得到的虚拟表中选出从指定位置开始的指定行数据,常用来做分页;

MySQL数据库的LIMIT支持如下形式的选择:limit n,m

表示从第n条记录开始选择m条记录。对于小数据,使用LIMIT子句没有任何问题,当数据量非常大的时候,使用LIMIT n, m是非常低效的。因为LIMIT的机制是每次都是从头开始扫描,如果需要从第60万行开始,读取3条数据,就需要先扫描定位到60万行,然后再进行读取,而扫描的过程是一个非常低效的过程。

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

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

相关文章

《自然》:欧洲根据已知基因序列合成新冠病毒,助力疫苗开发

来源&#xff1a;澎湃新闻当地时间5月4日&#xff0c;国际顶级学术期刊《自然》&#xff08;Nature&#xff09;以“加快评审文章”(Accelerated Article Preview)形式在线发表了来自瑞士、德国、俄罗斯多家科研机构的一项研究“Rapid reconstruction of SARS-CoV-2 using a sy…

转:日志组件logback的介绍及配置使用方法

转自&#xff1a;http://blog.csdn.net/zgmzyr/article/details/8267072 一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块&#xff1a;logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。lo…

谷歌论文:使用深度强化学习的芯片布局

来源&#xff1a;半导体行业观察摘 要在本项目中&#xff0c;我们提出了一种基于学习的芯片布局方法&#xff0c;这是芯片设计过程中最复杂&#xff0c;最耗时的阶段之一。与以前的方法不同&#xff0c;我们的方法具有从过去的经验中学习并随着时间的推移而不断改进的能力。特别…

联动菜单实现思路

1: 选择select时,如何触发? 哪种事件? onchange2: 如何获取被选中的option的值 ? selectobj.value3: 动态生成option innerHTML <select name"add" οnchange"change()"><option value"">请选择</option><option value…

mysql中主从复制包括什么意思_Mysql主从复制作用和工作原理

一、什么是主从复制主从复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff0c;主数据库一般是准实时的业务数据库。在最常用的mysql数据库中&#xff0c;支持单项、异步赋值。在赋值过程中&#xff0c;一个服务器充当主服务器&am…

吴建平院士:互联网视频技术在疫情防控中的重要作用

来源&#xff1a;互联网天地杂志疫情期间&#xff0c;要关注新一代信息技术助力疫情防控这个主题。最近新的技术非常多&#xff0c;但有一项技术可能被遗忘了&#xff0c;它属于新一代信息技术系列&#xff0c;在防控疾病或生活中发挥着很重要的作用&#xff0c;那就是互联网视…

java比较炫的小程序_推荐三款私藏多年的微信小程序

【小程序】(文后有福利)酷友们&#xff0c;大家好&#xff01;今天一次性给大家介绍三款实用的微信小程序吧。这三款微信小程序基本上可以卸掉对应的 APP 了。同等功能下的 APP 和 微信小程序&#xff0c;当然会选择后者嘛&#xff0c;不仅消耗内存小&#xff0c;而且方便。1. …

2019年全球数字化转型现状研究报告

来源&#xff1a;Prophet数字化是整个企业范围内的优先战略事项我们的年度《数字化转型现状》研究迎来第五个年头&#xff0c;继续记录企业的不断发展。随着颠覆性技术及其对各大企业和市场的影响力不断加大&#xff0c;我们的研究旨在捕捉促成现代数字化转型的变化和趋势。201…

java settcpnodelay_Python Twisted TCP socket如何设置TCP的NODELAY(禁用Nagle算法)?

我有一个正在继续开发的实时多人游戏(它目前在app store:https://itunes.apple.com/us/app/blewp!-eat-or-be-eaten-mmo/id996122625?mt8)上直播&#xff0c;我使用TCP和UDP发送实时消息(TCP用于需要可靠性的消息&#xff0c;比如玩家死亡)&#xff0c;服务器端是用python编写…

magent + memcached部署过程

magent memcached架构图 安装步骤如下&#xff1a; ------------------10.1.64.196 10.1.64.197 10.1.65.104 10.1.65.107 memcached (存储节点)---------------------------------------- yum install gcc mkdir /usr/local/src/memcached cd /usr/local/src/memcached ta…

BBC神作:半导体如何改变世界

来源&#xff1a;电子工程师笔记在纪录片领域BBC一直是打遍天下无敌手的存在作为纪录片王牌制作方近期&#xff0c;BBC与FedEx联合推出了神作Made on Earth系列《The humble mineral that transformed the world》作为零差评的重要一集用叹为观止的精良画面为观众讲述了半导体常…

jmeter练习(5)关联升级版—ForEach控制器(提取多个响应结果并依次传参)

前言&#xff1a;大多数情况下&#xff0c;我们会从上一个请求的响应结果中提取某一个值&#xff0c;作为第二个请求的参数进行传参&#xff0c;但是有时候为了提高测试效率&#xff0c;尽可能制造少的测试数据&#xff0c;我们需要从上一个请求的响应结果中获取某一组相同类型…

“天才少年”曹原再次连发2篇Nature!在魔角石墨烯取得系列新进展

来源&#xff1a;青塔、中国科学技术大学新创校友基金会、纳米人5月7日&#xff0c;被誉为“天才少年”的95后博士曹原分别以第一作者兼共同通讯作者、以及共同第一作者的身份&#xff0c;在《Nature》上连发2篇论文。第一篇Nature论文中&#xff0c;研究人员致力于通过对扭转角…

linux交叉编译aix_mips-linux-gcc交叉编译工具链搭建小结【转】

这几天开始做毕业设计了&#xff0c;MPEG2解码的MIPS实现&#xff0c;代码啥的网上一大堆&#xff0c;最大的困难也许不是理解代码&#xff0c;而是搭建环境&#xff0c;也就是搭建mips-linux-gcc交叉编译的环境。网上铺天盖地的都是arm-linux-gcc工具链的教程&#xff0c;唯独…

单链表的头插法和尾插法c语言实现

/*单链表的头插法和尾插法c语言实现*/ #include <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE 100/*简单的定义一个链表节点的数据单元*/typedef struct student_t{ int num; char name[SIZE]; struct student_t* pNext;}studentList, *pSt…

torry的困惑java代码_Java实现 蓝桥杯VIP 算法提高 Torry的困惑(提高型)

算法提高 Torry的困惑(提高型)时间限制&#xff1a;1.0s 内存限制&#xff1a;512.0MB问题描述Torry从小喜爱数学。一天&#xff0c;老师告诉他&#xff0c;像2、3、5、7……这样的数叫做质数。Torry突然想到一个问题&#xff0c;前10、100、1000、10000……个质数的乘积是多少…

ICLR认知科学@AI workshop一览

来源&#xff1a; 混沌巡洋舰今年ICLR2020顶会有一个特别有意思的专题&#xff0c; 叫认知科学与AI顶会专题。在当下深度学习愈发进入瓶颈期的时代&#xff0c;认知科学和AI的交叉成为大势所趋。一方面我们希望把认知科学或心理学的知识用起来直接指导AI&#xff0c;另一方面我…

MySql某一列累计查询

问题&#xff1a;有一列数据&#xff0c;需要累计显示出来 比如&#xff1a;id salary 查询结果&#xff1a;id salary sumSalary 1 10000 1 10000 10000 2 20000 2 20000 30000 3 30000 3 30000 6…

java中一个线程最小优先数_Java线程的优先级

Java线程可以有优先级的设定&#xff0c;高优先级的线程比低优先级的线程有更高的几率得到执行(不完全正确&#xff0c;请参考下面的“线程优先级的问题“)。记住当线程的优先级没有指定时&#xff0c;所有线程都携带普通优先级。优先级可以用从1到10的范围指定。10表示最高优先…

谷歌AI公布新项目:未来你的宠物可能真的会是“机器”狗!

From: Tech Crunch; 作者&#xff1a;Iris????或许你曾留心过狗是怎么行走的——它们走起路来肌腱运动流畅&#xff0c;步履灵活&#xff0c;并不必去思考下一步要怎么走&#xff0c;走路这个动作是自然而然发生的事情。而同样的动作&#xff0c;机器狗能够处理得这样自然吗…