SQL执行顺序理解
之前想对SQL优化能力这一方面进行提升,首先,要明白sql的执行顺序是怎样的,才能对sql性能进行优化
(8) SELECT (9)DISTINCT<select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE|ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
(11) LIMIT <limit_number>
首先呢,可以看到,先执行 FROM 操作,每一步操作都会产生一个虚拟表,当所有操作完成后,最终的虚拟表,也就是我们看到的查询出来的数据
- from:首先执行from操作,对<left_table>和<right_table>进行关联,执行笛卡尔积(可以理解为将左表中的每一条数据都与右表中的每一条数据进行匹配),产生一个虚拟表table1;
- on:对步骤1操作产生的虚拟表table1中的数据进行筛选,只有符合<join_condition>条件的才会插入虚拟表table2;
- join:如果指定了outer join(如:left outer join (左连接),right outer join(右连接)),就保留表中未匹配的行作为外部行添加到虚拟表table2中(也就是我们所说的:以左表为主表或者以右表为主表)产生虚拟表table3,如果关联了多个表,则对table3继续执行步骤1~步骤3,直到处理完所有的表;
- where: 对虚拟表table3执行where条件过滤,只有符合<where_condition>条件的数据才会被保留,产生虚拟表table4;
- group by :根据group by 字句中的列,对虚拟表table4进行分组操作,产生table5;
- with: CUBE|ROllUP: 对VT5进行CUBE或ROLLUP操作,产生表table6;
- having: 对虚拟表table6应用having过滤器,只有符合<having_condition>的记录才会被插入到table7;(注意:having是对数据的再筛选,和group by 组合着用的)
- select:再次执行select操作,查询table7中执行的字段,产生虚拟表table8;
- distinct:去除重复,产生table9;
- order by:对虚拟表table9中的数据按照<order_by_list>进行排序操作,(asc升序,由小到大;desc降序,由大到小),产生虚拟表table10;
- limit:取出指定行数的数据,产生虚拟表table11(也就是最终查询出来的数据),返回到页面显示。
附录: