MySQL手写顺序
select distinct <select_list> from <table_name> <join_type> join <join_table> on <join_condition> where <where_condition> group by <group_by_list> having <having_condition> order by <order_by_condition> limit <limt_number> |
MySQL执行顺序
- from <left table>
- on <on_condition>
- <join_type> join <join_table>
- where <where_condition>
- group by <group_by_list>
- <count()、sum()、avg()等聚合函数>
- having <having_condition>
- select <select_list>
- distinct
- order by <order_by_condition>
- limit <limit_number>
MySQL执行顺序理解
1. from(含子查询),from是查询的开端,首先需要知道最开始从哪个表开始的,确定数据源。
2. on,对虚表from语句的数据源进行on筛选,只有那些符合的行才会被记录在虚表T1中。
3. join,如果from后面是多张表,join关联,会首先对前两个表执行一个笛卡尔乘积,如果from子句中包含两个以上的表的话(存在多个join),那么就会对上一个join连接产生的结果和下一个表重复执行1~3这三个步骤,一直到处理完所有的表为止,这时候就会生成虚拟表T2。
4. where,对虚拟表T2进行where条件过滤。只有符合的记录才会被插入到虚拟表T3中。
5. group by,子句将T3中的唯一的值组合成为一组,得到虚拟表T4。
6. avg,sum…等聚合函数,聚合函数只是对分组的结果进行一些处理,拿到某些想要的聚合值,例如求和,统计数量等,并不生成虚拟表。
7. having,应用having筛选器,生成T5。having子句主要和group by子句配合使用,having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。
8. select,执行select操作,选择指定的列,插入到虚拟表T6中。
9. distinct,对T6中的记录进行去重。移除相同的行,产生虚拟表T7。
10.order by,应用order by子句。按照order_by_condition排序T7,此时返回的一个游标,而不是虚拟表。
11.limit,取出指定行的记录,产生虚拟表T8, 并将结果返回。