1、书写顺序sql
1 select[distinct] 2 from 3 join 4 on 5 where 6 group by 7 having 8 union 9 order by 10 limit
2、执行顺序函数
1 from 2 on 3 join 4 where 5 group by (可使用select中的别名,后面的语句中均可以使用) 6 having 7 select 8 distinct 9 union 10 order by 11 limit
以上每一个步骤都会产生一个虚拟表,该虚拟表被用做下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。若是没有在查询中指定某一个子句,将跳过相应的步骤。
一、首先对from子句中的前两个表执行一个笛卡尔乘积(交叉联接),此时生成虚拟表 VT1(选择相对小的表作基础表);
二、应用on筛选器,on 中的逻辑表达式将应用到 VT1 中的各个行,筛选出知足on逻辑表达式的行,生成虚拟表 VT2;
三、若是是外链接,就将添加外部行;若是是左链接,就把左表在第二步中过滤的添加进来; 若是是右链接,就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 VT3 ;
若是 from 子句中的表数目多余两个表,那么就将VT3和第三个表链接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终获得一个新的虚拟表 VT3;
四、对 VT3 应用 WHERE 筛选器,只有使为 true 的行才插入 VT4。
五、group by 子句将中的惟一的值组合成为一组,获得虚拟表VT5。若是应用了group by,那么后面的全部步骤都只能获得的VT5的列或者是聚合函数(count、sum、avg等)。缘由在于最终的结果集中只为每一个组包含一行;
六、应用cube或者rollup选项,为VT5生成超组,生成VT6.
七、应用having筛选器,生成VT7。having筛选器是第一个也是为惟一一个应用到已分组数据的筛选器
八、处理select子句。将VT7中的在select中出现的列筛选出来。生成VT8.
九、应用distinct子句,VT8中移除相同的行,生成VT9。事实上若是应用了group by子句那么distinct是多余的;
十、应用order by子句。按照order_by_condition排序VT9,此时返回的一个游标,而不是虚拟表。sql是基于集合的理论的,集合不会预先对他的行排序,它只是成员的逻辑集合,成员的顺序是可有可无的。对表进行排序的查询能够返回一个对象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。正由于返回值是游标,那么使用order by 子句查询不能应用于表表达式;
十一、应用limit,从游标开始处选择指定数量或比例的行,生成表 TT11,并返回给用户。spa