SQL语句的执行顺序:
1 from
2 join
3 on
4 where
5 group by
6 avg sum等聚合函数
7 having
8 select
9 distinct
10 order by
每一步的执行,都会生成一个虚拟表
1 首先执行 from,如果存在多表的情况,现将前边两个表执行笛卡尔积,会以相对比较小的表做基础表,生成一个虚拟表t1
2 在使用on筛选。on中的逻辑表达式,将会用于t1中的筛选,会生成t2.
3 如果使用了左连或者右连,会将第二部筛选掉的部分在重新补回来。比如左连接,会将筛掉的左表数据重新添加回来,这样生成t3
4 如果有2个以上的表连接,那么在将t3和与后边表在进行笛卡尔积,然后重复执行on和join。最总得到一个新的t3表
5 应用where筛选器,对t3在进行筛选,生成t4。
6 执行group by,将t4中唯一的值合成一组,生成t5.如果使用分组,那么后边的只能得到t5的列或者聚合函数,因为最终的结果集中值为每个组包含一行。
7 执行having,生成t6,having是唯一一个应用到已分组数据的筛选器
8 执行select。将t6中的数据仅一步筛选得到t7。
9 执行distinct,移除t7中相同的行。生成t8.如果使用了分组那么distinct就是无用的。因为在分组的时候,已经经列中的唯一的值分成一组。同时只返回一行,所以所有的数据都是不同的。
10 执行order by ,对t8在按照指定的字段进行排序。此时返回的事一个游标,而不是虚拟表。sql是基于集合的理论的,集合不会对返回结果排序,对表进行排序可以返回一个对象,这个对象包含了特定的物理顺序的逻辑关系。这就是游标。因为排序是比较消耗资源的,所以做好不要进行排序。
执行顺序:
from>where>group by>having>order by >select >limit