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 06 MySQL
MySQL kill不掉线程的原因
May 07 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
MySql数据库 查询时间序列间隔
May 11 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超级全局变量
2010/01/26 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
PHPStrom中实用的功能和快捷键大全
2015/09/23 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
Jquery中&quot;$(document).ready(function(){ })&quot;函数的使用详解
2013/12/30 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
easyui validatebox验证
2016/04/29 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
剖析Angular Component的源码示例
2018/03/23 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
Python构建图像分类识别器的方法
2019/01/12 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
美国家具网站:Cymax
2016/09/17 全球购物
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
汉语专业应届生求职信
2013/10/01 职场文书
周鸿祎:教你写创业计划书
2013/12/30 职场文书
商场中秋节广播稿
2014/01/17 职场文书
合作意向协议书范本
2014/03/31 职场文书
授权委托书怎么写
2014/09/25 职场文书
师德师风整改措施
2014/10/24 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
关于mysql中string和number的转换问题
2022/06/14 MySQL