MySQL的执行顺序
MySQL语句一共分为11步,最先执行的是FROM操作,最后执行的是LIMIT操作,其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是虚拟的表对用户来说是透明的,只有最后一个虚拟表会被作为结果返回,如果没有在语句中指定某一个子句,那么将会跳过相应的步骤。
(8) SELECT
(9) DISTINCT
(1) FROM
(3) JOIN
(2) ON
(4) WHERE
(5) GROUP BY
(6) WITH {CUBE|ROLLUP}
(7) HAVING
(10) ORDER BY
(11) LIMIT
详情:
- FROM : 对 FROM 的左边的表和右边的表计算笛卡尔积,产生虚表VT1
- ON:对虚表VT1 进行ON筛选,只有那些符合
的行才会被记录在虚表VT2中。 - JOIN:如果指定了OUTER JOIN(比如left join, right join),那么保留表中未匹配的竺就会作为外部添行添加到VT2中,产生虚表VT3,rug from 中包含两个以上的表话,那么就会对上一个join连接产生结果的VT3和下一个表重复执行步骤1~3,一直到处理完所有表为止。
- WHERE:对虚拟表VT3进行WHERE 条件过滤,只有符合
的记录才会被插入到虚拟表VT4中。 - GROUP BY: 根据group by 子句中的列,对VT4的记录进行分组操作,产生 VT5.
- CUBE| ROLLUP:对表VT5进行CUBE或者rollup操作,产生 VT6。
- HAVING: 对虚拟表VT6 应用having过滤,只有符合
的记录才会被插入到虚拟表VT7中。