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…

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

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

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

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

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

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

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

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

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…

ICLR认知科学@AI workshop一览

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

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

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

java王大拿谢大脚_《乡村爱情1》:“王大拿”赵本山有3大亮点,追谢大脚根本不算啥...

《乡村爱情》第一部其实导演并不是赵本山&#xff0c;那时候的他和该剧的导演张惠中是好友关系&#xff0c;里面的各大主演除了“王小蒙”王亚彬外其余都是以赵本山的徒弟为主&#xff0c;很多人都是冲着赵本山的名气来观看这部剧的。其实赵本山在《乡村爱情》第一部中饰演的“…

记忆的天空:智能进化三部曲

作者&#xff1a;钟振余&#xff0c;宁波大学 相对于人工智能的快速发展&#xff0c;人类对于生命智能的理解显得很肤浅。由于缺失大脑活动原理的理论指导&#xff0c;人们只能用知识考试去评判一个人的智能&#xff0c;用相当于几岁孩子的智能去比对某些高级动物的智能。事实上…

收藏!机器学习算法分类图谱及其优缺点综合分析

来源&#xff1a;必达智库近日&#xff0c;Coggle对各类机器学习算法进行了归纳整理&#xff0c;形成了一个较为完整的机器学习算法分类图谱&#xff0c;并对每一类算法的优缺点进行了分析。具体分类如下&#xff1a;正则化算法&#xff08;Regularization Algorithms&#xff…

StringBuilder String string.Concat 字符串拼接速度再议

首先看测试代码&#xff1a; 1 public class StringSpeedTest2 {3 private readonly static string _testStr "0123456789";4 5 public string StringAdd(int count)6 {7 string str string.Empty;8 for (i…

特斯拉Autopilot事故频发,真正意义上自动驾驶还要多久问世?

这并不是特斯拉 Autopilot 首次发生事故致死案例。来源&#xff1a;未来汽车科技的新能源汽车更替传统汽车是时代趋势&#xff0c;作为业内先驱&#xff0c;身处聚光灯下的特斯拉不可避免会受到大众关注&#xff0c;例如涉及它的每一次交通安全事件从不会在媒体报道中缺席。据外…

BDD 与DSL 入门

正文&#xff1a; Behavior Driven Development&#xff0c;行为驱动开发是一种敏捷软件开发的技术&#xff0c;它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。在了解Behavior Driven Development之前&#xff0c;先介绍Test-Driven Development(TDD)即测试…

CICC科普栏目|颠覆认知!看完这些图,你的世界观还好吗?

本文系网易新闻网易号“各有态度”特色内容部分资料来源于网络转自&#xff1a;超级数学建模接下来&#xff0c;仔细看下面的图与文字你会非常震撼……每天&#xff0c;地球上都有这么多的人在飞来飞去&#xff0c;就像下图中一样。▼图中圈圈里头的人口&#xff0c;比其他地区…