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 07 MySQL
MySQL Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
详解MySQL 联合查询优化机制
May 10 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
Mysql数据库索引面试题(程序员基础技能)
May 31 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 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之apc
2013/05/15 PHP
PHP小技巧之函数重载
2014/06/02 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
js对字符的验证方法汇总
2015/02/04 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
Vue表单实例代码
2016/09/05 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
Python判断Abundant Number的方法
2015/06/15 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
Python flask框架post接口调用示例
2019/07/03 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
学生个人求职自荐信格式
2013/09/23 职场文书
无工作经验者个人求职信范文
2013/12/22 职场文书
广告语设计及教案
2014/03/21 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
MySQL索引是啥?不懂就问
2021/07/21 MySQL
Python面试不修改数组找出重复的数字
2022/05/20 Python