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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySQL root密码的重置方法
Apr 21 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
MySQL系列之五 视图、存储函数、存储过程、触发器
Jul 02 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
MySQL 用 limit 为什么会影响性能
Sep 15 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
MYSQL如何查看操作日志详解
May 30 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 中关于ord($str)&amp;gt;0x80的详细说明
2012/09/23 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
php实现cookie加密的方法
2015/03/10 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
range 标准化之获取
2011/08/28 Javascript
javascript折半查找详解
2015/01/26 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
vue实现树形菜单效果
2018/03/19 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
maptalks+three.js+vue webpack实现二维地图上贴三维模型操作
2020/08/10 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
python实现udp数据报传输的方法
2014/09/26 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
使用Python对Access读写操作
2017/03/30 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
python+flask实现API的方法
2018/11/21 Python
Python编写打字训练小程序
2019/09/26 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
Python接口测试get请求过程详解
2020/02/28 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
高级Java程序员面试要点
2013/08/02 面试题
写好自荐信需做到的5要点
2014/03/07 职场文书
挂职个人工作总结
2015/03/05 职场文书
分家协议书范本
2016/03/22 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
PHP中->和=>的意思
2021/03/31 PHP
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS
vue组件vue-esign实现电子签名
2022/04/21 Vue.js