MySQL排序的两种方式 mysql升序和降序语句

语句中各子句完整执行顺序概括(按照顺序号执行):

  1. from (这里也包括from中的子语句)
  2. join
  3. on
  4. where
  5. group by(开始使用select中的别名,后面的语句中都可以使用;但是不能使用ROW_NUMBER()等窗口函数的别名)
  6. avg,sum…. 等聚合函数
  7. having
  8. select
  9. distinct
  10. order by
  11. limit
每个子句执行顺序分析所有的 查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表 , 这个虚拟表将作为下一个执行步骤的输入 。
1、from
form是一次查询语句的开端 。
  • 如果是一张表,会直接操作这张表;
  • 如果这个from后面是一个子查询,会先执行子查询中的内容,子查询的结果也就是第一个虚拟表T1 。(注意:子查询中的执行流程也是按照本篇文章讲的顺序哦) 。
  • 如果需要关联表,使用join,请看2 , 3
2、join
如果from后面是多张表 , join关联,会首先对前两个表执行一个笛卡尔乘积,这时候就会生成第一个虚拟表T1(注意:这里会选择相对小的表作为基础表);
3、on
对虚表T1进行ON筛?。?只有那些符合的行才会被记录在虚表T2中 。(注意 , 这里的这里如果还有第三个表与之关联,会用T2与第三个表进行笛卡尔乘积生产T3表,继续重复3. on步骤生成T4表,不过下面的顺序讲解暂时不针对这里的T3和T4 , 只是从一个表关联查询T2继续说)
4、where
对虚拟表T2进行WHERE条件过滤 。只有符合的记录才会被插入到虚拟表T3中 。
5、group by
group by 子句将中的唯一的值组合成为一组,得到虚拟表T4 。如果应用了group by,那么后面的所有步骤都只能操作T4的列或者是执行6.聚合函数(count、sum、avg等) 。(注意:原因在于分组后最终的结果集中只包含每个组中的一行 。谨记 , 不然这里会出现很多问题,下面的代码误区会特别说 。)
6、avg,sum…. 等聚合函数
聚合函数只是对分组的结果进行一些处理,拿到某些想要的聚合值,例如求和,统计数量等,并不生成虚拟表 。
7、having
应用having筛选器,生成T5 。HAVING子句主要和GROUP BY子句配合使用,having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器 。
8、select
执行select操作,选择指定的列,插入到虚拟表T6中 。
9、distinct
对T6中的记录进行去重 。移除相同的行,产生虚拟表T7.(注意:事实上如果应用了group by子句那么distinct是多余的,原因同样在于,分组的时候是将列中唯一的值分成一组 , 同时只为每一组返回一行记录,那么所以的记录都将是不相同的 。)
10、order by
应用order by子句 。按照order_by_condition排序T7,此时返回的一个游标 , 而不是虚拟表 。sql是基于集合的理论的,集合不会预先对他的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的 。对表进行排序的查询可以返回一个对象,这个对象包含特定的物理顺序的逻辑组织 。这个对象就叫游标 。
oder by的几点说明