SQL语句执行顺序

一、SQL执行顺序 

(1) FROM: 对FROM子句中的左表`<left_table>`和右表`<right_table>`执行笛卡儿积,产生虚拟表VT1;FROM子句执行顺序为从后往前、从右到左,FROM 子句中写在最后的表(基础表 driving table)将被最先处理,即最后的表为驱动表,当FROM 子句中包含多个表的情况下,我们需要选择数据最少的表作为基础表。


(2) ON: 对虚拟表VT1进行ON筛选,只有那些符合`<join_condition>`的行才被插入,产生虚拟表VT2;


(3) JOIN: 如果指定了`OUTER JOIN`(如LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表VT2,产生虚拟表VT3。如果FROM子句包含两个以上的表,

则对上一个连接生成的结果表VT3和下一个表重复执行步骤1~步骤3,直到处理完所有的表;

保留表如下:

  • LEFT OUTER JOIN把左表记为保留表
  • RIGHT OUTER JOIN把右表记为保留表
  • FULL OUTER JOIN把左右表都作为保留表


(4) WHERE: 对虚拟表VT3应用WHERE过滤条件,只有符合`<where_condition>`的记录才会被插入到VT4;


(5) GROUP By: 根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生VT5;如果应用了GROUP BY,那么后面的所有步骤都只能得到的虚拟表VT5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。


(6) AGG_FUNC 计算聚合函数,计算 max 等聚合函数。SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。常用的 Aggregate 函数包涵以下几种:

AVG:返回平均值
COUNT:返回行数
FIRST:返回第一个记录的值
LAST:返回最后一个记录的值
MAX: 返回最大值
MIN:返回最小值
SUM: 返回总和
 

(7) CUBE|ROllUP: 对VT5进行CUBE或ROLLUP操作,产生VT6;


(8) HAVING: 对虚拟表VT6应用HAVING过滤器,只有符合`<having_condition>`的记录才会被插入到VT7;HAVING 语句在SQL中的主要作用与WHERE语句作用是相同的,但是HAVING是过滤聚合值,在 SQL 中增加 HAVING 子句原因就是,WHERE 关键字无法与聚合函数一起使用,HAVING子句主要和GROUP BY子句配合使用。


(9) SELECT: 第二次执行SELECT操作,选择指定的列,插入到虚拟表VT8中;


(10) DISTINCT: 去除重复,得到虚拟表VT9;


(11) ORDER BY: 将虚拟表VT9中的记录按照`<order_by_list>`进行排序操作,得到虚拟表VT10;将虚拟表 VT9中的行按ORDER BY 子句中的列/列表排序,生成游标 VC10 ,注意不是虚拟表。因此使用 ORDER BY 子句查询不能应用于表达式。同时,ORDER BY子句的执行顺序为从左到右排序,是非常消耗资源的。


(12) LIMIT: 取出指定行的记录,产生虚拟表VT11,并返回给查询用户
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值