SQL执行顺序浅析

(8)SELECT

(9) DISTINCT

(11) Limit/Top

(1) FROM

(3) JOIN

(2) ON

(4) WHERE

(5) GROUP BY

(6) WITH {CUBE | ROLLUP}

(7) HAVING

(10) ORDER BY 

下面我们来具体分析一下查询处理的每一个阶段 

(1)FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1 

(2)ON: 对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。 

(3)JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。 

(4)WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。 

(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: 对VT8中的记录进行去重。产生虚拟表VT9. 

(10)ORDER BY: 将虚拟表VT9中的记录按照进行排序操作,产生虚拟表VT10. 

(11)LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。 

总结:

写的顺序:select ... from... where.... group by... having... order by.. limit [offset,] (rows) 

执行顺序:from... where...group by... having.... select ... order by... limit


group by 存在时,select中除了聚集函数外,所有的基本列必须是group by里面存在的;having基本上同group by一起使用的,having类似于where语句,只是having过滤是基于group by 分组后的数据,having一般通过select语句里面的聚集函数进行过滤。


你可能感兴趣的:(SQL执行顺序浅析)