SQL查询执行的流程

SQL查询执行的流程

在这里插入图片描述
在SQL 语言中,第一个被处理的子句总是FROM,而且每一步的操作都会产生一个虚拟表,该虚拟表作为一个处理的输入,这些虚拟表对用户是透明的,只有最后一步才会返回给用户

1.FROM

会对from子句的左表和右表执行笛卡尔积,产生虚拟表VT1(左表和右表分别为上图中的<left_table><right_table>)在这里插入图片描述

2.ON

生成虚拟表VT2,对虚拟表VT1进行筛选,将符合的行插入到VT2中

3.JOIN

为OUTER JOIN (left outer join,right outer join) 那么保留表(主表)中未匹配的行,做为外部行添加到虚拟表VT2中,产生虚拟表VT3,如果from子句包含2个以上表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1到步骤3

4.WHERE

对虚拟表VT3进行WHERE过滤,只有符合条件的记录才会插入到虚拟表VT4中

where 与 on的区别对于OUTER JOIN中的过滤,在ON过滤完后还可以添加被ON过滤掉的记录而where条件过滤的记录是永久性过滤

5.GROUP BY

根据GROUP BY子句的列,对VT4中的记录进行分组操作,产生VT5

6.CUBE|ROLLUP(对分组进行汇总)

对VT5表进行CUBE或ROLLUP操作,产生表VT6

7.HAVING

对VT6进行HAVING过滤,符合条件的会被插入虚拟表VT7中

8.SELECT

第二次执行select操作,选择指定的例到序列表VT8中

9.DISTINCT

去除重复数据,产生序列表VT9

GROUP BY 的查询后在使用DISTINCT是多余的因为已经分组了

10.ORDER BY

将虚拟表VT9按照条件进行排序,产生虚拟表VT10

在mysql中NULL被认为是最小值

11.LIMIT

取出指定行的记录,产生虚拟表VT11并返回给查询用户。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值