mysql sql先后执行_MySQL中SQL语句执行顺序
(7) SELECT
(8) DISTINCT
(1) FROM
(3) JOIN
(2) ON
(4) WHERE
(5) GROUP BY
(6) HAVING
(9) ORDER BY
(10) LIMIT
前期准备工作
1、新建一个测试数据库
create database testData;
2、创建测试表,并插入数据如下:
用户表
订单表
准备SQL逻辑查询测试语句
SELECT a.user_id,COUNT(b.order_id) as total_orders
FROM user as a
LEFT JOIN orders as b
ON a.user_id = b.user_id
WHERE a.city = 'beijing'
GROUP BY a.user_id
HAVING COUNT(b.order_id) < 2
ORDER BY total_orders desc
使用上述SQL查询语句来获得来自北京,并且订单数少于2的客户;
在这些SQL语句的执行过程中,都会产生一个虚拟表,用来保存SQL语句的执行结果
一、执行FROM语句
第一步,执行FROM语句。我们首先需要知道最开始从哪个表开始的,这就是FROM告诉我们的。现在有了和两个表,我们到底从哪个表开始,还是从两个表进行某种联系以后再开始呢?它们之间如何产生联系呢?——笛卡尔积
经过FROM语句对两个表执行笛卡尔积,会得到一个虚拟表,VT1(vitual table 1),内容如下:
总共有28(user的记录条数 * orders的记录条数)条记录。这就是VT1的结果,接下来的操作就在VT1的基础上进行
二、执行ON过滤
执行完笛卡尔积以后,接着就进行ON a.user_id = b.user_id条件过滤,根据ON中指定的条件,去掉那些不符合条件的数据,得到VT2如下:
select * from user as a inner JOIN orders as b ON a.user_id = b.user_id;
三、添加外部行
这一步只有在连接类型为OUTER JOIN时才发生,如LEFT OUTER JOIN、RIGHT OUTER JOIN和FULL OUTER JOIN。在大多数的时候,我们都是会省略掉OUTER关键字的,但OUTER表示的就是外部行的概念。
LEFT OUTER JOIN把左表记为保留表:即左表的数据会被全部查询出来,若右表中无对应数据,会用NULL来填充:
RIGHT OUTER JOIN把右表记为保留表:即右表的数据会被全部查询出来,若左表中无对应数据,则用NULL补充;
FULL OUTER JOIN把左右表都作为保留表,但在Mysql中不支持全连接,可以通过以下方式实现全连接:
select * from A left join B on A.id = B.id (where 条件)
union
select * from A right join B on A.id = B.id (where条件);
由于我在准备的测试SQL查询逻辑语句中使用的是LEFT JOIN,得到的VT3表如下:
四、执行where条件过滤
对添加了外部行的数据进行where条件过滤,只有符合条件的记录会被筛选出来,执行WHERE a.city = 'beijing'得到VT4如下:
但是在使用WHERE子句时,需要注意以下两点:
1、由于数据还没有分组,因此现在还不能在where过滤条件中使用where_condition=MIN(col)这类对分组统计的过滤;
2、由于还没有进行列的选取操作,因此在select中使用列的别名也是不被允许的,如:select city as c from table1 wherec='beijing' 是不允许的
五、执行group by分组语句
GROU BY子句主要是对使用WHERE子句得到的虚拟表进行分组操作,执行GROUP BY a.user_id得到VT5如下:
六、执行having
HAVING子句主要和GROUP BY子句配合使用,对分组得到VT5的数据进行条件过滤,执行HAVING COUNT(b.order_id) < 2,得到VT6如下:
七、select列表
现在才会执行到SELECT子句,不要以为SELECT子句被写在第一行,就是第一个被执行的。
我们执行测试语句中的SELECT a.user_id,user_name,COUNT(b.order_id) as total_orders,从VT6中选择出我们需要的内容,得到VT7如下:
八、执行distinct去重复数据
如果在查询中指定了DISTINCT子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。这张临时表的表结构和上一步产生的虚拟表是一样的,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来除重复数据。测试SQL中没有DISTINCT字句,所以不会执行
九、执行order by字句
对虚拟表VT7中的内容按照指定的列进行排序,然后返回一个新的虚拟表,我们执行测试SQL语句中的ORDER BY total_orders DESC ,得到结果如下:
DESC倒序排序,ASC升序排序
十、执行limit字句
LIMIT子句从上一步得到的虚拟表中选出从指定位置开始的指定行数据,常用来做分页;
MySQL数据库的LIMIT支持如下形式的选择:limit n,m
表示从第n条记录开始选择m条记录。对于小数据,使用LIMIT子句没有任何问题,当数据量非常大的时候,使用LIMIT n, m是非常低效的。因为LIMIT的机制是每次都是从头开始扫描,如果需要从第60万行开始,读取3条数据,就需要先扫描定位到60万行,然后再进行读取,而扫描的过程是一个非常低效的过程。
mysql sql先后执行_MySQL中SQL语句执行顺序相关推荐
- mysql sql 时间比较_mysql中sql语句进行日期比较
这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DAY ...
- mysql特殊字符小于 大于_MySQL 中SQL语句特殊字符如何处理(大于号, 小于号等)
前言: 我们在使用mybatis时SQL是写在xml映射文件中,如果写的sql中有一些特殊字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,因为转义之后可能会出现一些问题比如SQL语句无 ...
- hmi中的宏指令是c语言,HMI中的宏指令编程中的语句执行顺序是?
HMI中的宏指令编程中的语句执行顺序是? 以威纶通里的例子为例: 4. if结构语句 macro_command main() int k[10], j for j = 0 to 10 k[j] = ...
- mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天
mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...
- mysql排序显示行数的语句_MySQL中sql语句count(*),orderby,随机数据展示。
count(*)这么慢,我该怎么办? MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高: 而 InnoDB 引擎就麻烦了,它执行 count ...
- mysql删除列前判断_MySQL中,删除列的SQL语句是( )
参考答案如下 除列[单选题]在某个事件过程中定义的变量是______ 语句[单选题]Moving forward even in the face of great difficulties has ...
- mysql sql 事务写作_mysql中的事务
MySQL事务相关 一. 什么是事务 事务(Transaction)是一个逻辑序列,该序列要么执行,要么不执行. 例如:转换业务 A 给 B 转账 1000 元,设计两个操作: A减少1000元 B增 ...
- mysql 隐式提交事务_MySQL的SQL语句 -事务性语句和锁定语句(2)- 致使隐式提交的语句...
致使隐式提交的语句html 本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像在执行语句以前执行了 COMMIT 同样.mysql 大多数这些语句在执行后也会致使隐式提交. ...
- mysql教程or怎么用_MySQL中or语句用法示例
1.mysql中or语法的使用,在mysql语法中or使用注意点. 项目遇到坑,遍历发放奖励数据查询错误!!! $sql = 'SELECT * FROM `vvt_spread_doubleegg_ ...
最新文章
- (转)javascript关于运动的各种问题经典总结
- apache activemq ActiveMQ 修改密码
- jQuery三级下拉菜单
- bzoj1013球形空间
- Mac用户SVN图形界面推荐
- MySQL优化filler值_MySQL 性能优化神器 Explain 使用分析
- Oracle 安装 网络配置 警告
- 讲讲金融业务(一)--自助结算终端POS
- Mac 开发 Hue
- Spring依赖注入流程【完整版】(populateBean方法内部执行流程)
- xp任务栏一直闪跳怎么办_电脑任务栏闪烁以及任务栏图标闪烁解决办法
- 物理卷、卷组与逻辑卷的关系及相关操作详述
- 【Flocking算法】海王的鱼塘是怎样炼成的
- python 排产计划_生产排程计划表
- day06 Elasticsearch搜索引擎2
- IP-guard如何实现远程控制或远程文件传送时,不在客户端弹出授权提示
- android 多个按钮居中,Android手机开发 使用线性布局和相对布局实现Button垂直水平居中...
- 批量注释基因到基因座上(map gene to locus)
- 对互联网的认识和看法,直接关系到产业互联网的路径发展
- 实现制作萝莉语音包前的准备——百度AI的使用介绍
热门文章
- 【Python基础知识-pycharm版】第七节-函数
- java部署jar还是war优劣_详解Spring Boot 部署jar和war的区别
- linux系统限制内存使用率,linux中限制CPU和内存占用率方法
- python xlrd使用_python处理Excel xlrd的简单使用
- 一份北大信科内部流传的 “CS 自救指南”
- 关于深度学习,我们写了一本1400页的全栈手册
- pycharm插件之SonarLint
- 【HTML/CSS】display相关属性
- Windows下如何搭建Gradle环境?
- 用vb.net实现拖放功能