mysql执行顺序
手写sql顺序
select <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> <sum()avg()等聚合函数> having <having_condition> select <select_list> distinct order by <order_by_condition> limit <limit_number>
1、FROM: 对from的左边的表和右边的表计算笛卡尔积,产生虚拟表VT1
2、ON: 对虚拟表VT1进行on筛选,只有那些符合join-condition的行才会被记录在虚表VT2
3、JOIN: 如果指定outer join(比如left join、right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3,rug from子句中包括两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行执行步骤1-3这3个步骤,一直到处理完所的表为止
4、WHERE: 对虚拟表VT3进行where条件过滤。只有符合where-condition的记录才会被插入到虚拟表VT4中
5、GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生表VT5
6、CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.
6、HAVING: 对虚拟表VT6应用having过滤,只有符合 having-condition 的记录会被插入到虚拟表VT7中。
7、SELECT:执行select操作,选择指定的列的,插入到虚拟表VT8中
8、DISTINCT:对VT8中的记录进行去重。 产生虚拟表VT9
9、ORDER BY:对虚拟表VT9中的记录按照 order_by_list 进行排序操作,产生虚拟表VT10
10、LIMIT:取出指定行的记录,产生虚拟表VT11,并将结果返回