MYSQL语句执行顺序
MySql Review
SQL语句执行顺序
1. FROM
对 FROM 子句中的左表 <left_table>
和右表 <right_table>
执行笛卡儿积,产生虚拟表 VT1;
2. ON
对虚拟表 VT1 进行 ON 筛选,只有那些符合 <join_condition>
的行才被插入,产生虚拟表 VT2;
3. JOIN
如果指定了 OUTER JOIN
(如 LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表 VT2,产生虚拟表 VT3。如果 FROM 子句包含两个以上的表,则对上一个连接生成的结果表 VT3 和下一个表重复执行步骤 1~ 步骤 3,直到处理完所有的表;
4. WHERE
对虚拟表 VT3 应用 WHERE 过滤条件,只有符合 <where_condition>
的记录才会被插入到 VT4;
5. GROUP BY
根据 GROUP BY 子句中的列,对 VT4 中的记录进行分组操作,产生 VT5;
6. CUBE | ROllUP
对 VT5 进行 CUBE 或 ROLLUP 操作,产生 VT6;
7. HAVING
对虚拟表 VT6 应用 HAVING 过滤器,只有符合 <having_condition>
的记录才会被插入到 VT7;
8. SELECT
第二次执行 SELECT 操作,选择指定的列,插入到虚拟表 VT8 中;
9. DISTINCT
去除重复,得到虚拟表 VT9;
10. ORDER BY
将虚拟表 VT9 中的记录按照 <order_by_list>
进行排序操作,得到虚拟表 VT10;
11. LIMIT
取出指定行的记录,产生虚拟表 VT11,并返回给查询用户
巧记顺序:
from where group by having order by select limit
Other
严格来说,select 里的别名在这其之前的字段是用不了的,但是 mysql 比较特殊,它会先扫描一遍 select 中的别名,所以后面就能用了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MrSecond's Blog!
评论