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学习笔记之事务隔离级别详解
May 12 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
MySQL 5.7常见数据类型
Jul 15 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
mysql的数据压缩性能对比详情
Nov 07 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
MySQL数据库简介与基本操作
May 30 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
如何过滤高亮显示非法字符
2006/10/09 PHP
使用无限生命期Session的方法
2006/10/09 PHP
php数据库备份还原类分享
2014/03/20 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
JQuery 写的个性导航菜单
2009/12/24 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Python深入学习之内存管理
2014/08/31 Python
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
python求最大连续子数组的和
2018/07/07 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
用python计算文件的MD5值
2020/12/23 Python
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
我的网上商城创业计划书
2013/12/26 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
新生入学欢迎词
2015/01/26 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers