sql的select执行顺序(百度sql的执行顺序,做了点笔记,记录学习一下)
form--->on--->join--->where--->group by--->having--->select--->distinct--->order by--->limit
每次操作都会产生一张虚拟的表,这个虚拟表作为下一个执行步骤的输入。
form:对from子句中的前两个表计算笛卡尔积,产生虚拟表VT1
on:对VT1进行on过滤,只有符合join条件的行才会被记录到虚拟表VT2中
join:如果是outer join添加外部行;left outer join 添加过滤后的左表;right outer join 添加过滤后的右表;生成虚拟表VT3
--------------------------------------------------------------------------------------------------------------
执行完join,如果from子句中还有表,那么把第三张表和VT3一起,重复上面的步骤,得到新的VT3
--------------------------------------------------------------------------------------------------------------
where:对虚拟表VT3进行where条件过滤,只有符合<where-condition>才会被插入到新的虚拟表VT4中
group by:将VT4中唯一的值组合成为一组,得到虚拟表VT5;如果应用了group by,那么后面的所有操作只能得到VT5的列,或者是聚合函数(count,sum,avg等)。因为在最终的结果集中只为每个组包含了一行。
cube|rollup:对VT5进行cube|rollup操作,生成VT6
having:通过having筛选生成VT7,是唯一一个能在已分组数据中过滤数据的
select:将VT7中在Select出现的列筛选出来。生成VT8
distinct:移除VT8中相同的行,生成VT9(如果sql用了group by这个就显得多余了)
order by:按照<order by-condition>排序VT9,这个时候返回的是游标,不是虚拟表。正是因为返回值是游标,所以使用order by子句查询不能应用于表表达式。(排序是很需要成本的,除非是必须要排序,否则最好不要指定order by)
limit:取出指定行的记录,返回结果给用户。