MySQL 语句执行顺序举例解析


Posted in MySQL onJune 05, 2022

1、SQL数据举例

举例:有10个用户,输出在订单表中下单数最多的5个人的名字。

my_user 表数据

MySQL 语句执行顺序举例解析

my_order数据

my_order,uid对应my_user表的id:

MySQL 语句执行顺序举例解析

测试数据生成

写一个存储过程,随机插入10000条数据:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test_loop`( )  
 BEGIN  
 DECLARE  
     i INT DEFAULT 1;  
 WHILE  
     i < 10000 DO  
     INSERT INTO my_order ( oid, uid )  
 VALUES  
     (  
     CONCAT( 'o_', DATE_FORMAT( now( ), '%Y%m%d%h%i%s' ), FLOOR(1000 + RAND( )*(9999-1000) )),  
     FLOOR( 1 + RAND( ) * 10 )   
     );  
 SET i = i + 1;  
 END WHILE;  
 END

查询语句:

SELECT
	u.id,
	u.`name`,
	count( o.uid ) count_num 
FROM
	my_user u
	JOIN my_order o ON u.id = o.uid 
GROUP BY
	o.uid 
HAVING
	COUNT( o.uid ) 
ORDER BY
	COUNT( o.uid ) DESC 
	LIMIT 5;

查询结果(以自己数据为准):

MySQL 语句执行顺序举例解析

统计所有的用户订单数:

SELECT
	u.id,
	u.`name`,
	count( o.uid ) count_num 
FROM
	my_user u
	JOIN my_order o ON u.id = o.uid 
GROUP BY
	o.uid 
HAVING
	COUNT( o.uid ) 
ORDER BY
	COUNT( o.uid ) DESC

结果如下:

MySQL 语句执行顺序举例解析

该sql 主要考察 group by 和 having 的使用,然后 order by 和 desc 排序。

2、SQL的执行顺序

  • FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。
  • ON: 对虚表VT1进行ON过滤,只有那些符合的行才会被记录在虚表VT2中。
  • JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。
  • WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
  • GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。
  • HAVING: 对虚拟表VT5应用having过滤,只有符合的记录才会被 插入到虚拟表VT6中。
  • SELECT: 执行select操作,选择指定的列,插入到虚拟表VT7中。
  • DISTINCT: 对VT7中的记录进行去重。产生虚拟表VT8.
  • ORDER BY: 将虚拟表VT8中的记录按照进行排序操作,产生虚拟表VT9.
  • LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。

到此这篇关于MySQL 语句执行顺序举例解析的文章就介绍到这了,更多相关MySQL 语句执行顺序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL慢查询的坑
Apr 28 MySQL
为什么mysql字段要使用NOT NULL
May 13 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
Sep 23 MySQL
MySql数据库触发器使用教程
Jun 01 #MySQL
MySQL选择合适的备份策略和备份工具
MySQL普通表如何转换成分区表
May 30 #MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 #MySQL
MySQL数据库安装方法与图形化管理工具介绍
MySQL数据库简介与基本操作
May 30 #MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 #MySQL
You might like
php 分页原理详解
2009/08/21 PHP
javascript 小型动画组件与实现代码
2010/06/02 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
Python Socket编程详细介绍
2017/03/23 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
Django-migrate报错问题解决方案
2020/04/21 Python
python如何查看网页代码
2020/06/07 Python
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
聘任书模板
2014/03/29 职场文书
给学校的建议书范文
2014/05/15 职场文书
应届生面试求职信
2014/07/02 职场文书
2015年企业新年寄语
2014/12/08 职场文书
学前教育见习总结
2015/06/23 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
MySQL 数据表操作
2022/05/04 MySQL