SQL语句的执行顺序

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

 

上一篇:where,group by,having,order by执行顺序


下一篇:SQL查询语句(where、jion、limit、group by、having等等)执行先后顺序