Mysql -- 关键字的执行顺序

我们平时使用的查询 sql 基本格式如下:

1
2
3
4
5
6
7
8
9
SELECT DISTINCT <select_list>
FROM <left_table>
  <join_type> JOIN <right_table>
    ON <join_condition>
    WHERE <where_condition>
    GROUP BY <group_by_condition>
    HAVING <having_condition>
    ORDER BY <order_by>
    LIMIT <limit_number>;

实际的执行顺序并不是如上书写顺序一样的:

  • FROM: 对 from 左右的表计算笛卡尔积,产生虚拟表VT1
  • ON: 对笛卡尔积进行筛选,只有符合条件的行才会被记录到虚拟表VT2中;
  • JOIN: 如果是 OUT JOIN,那么将保留表中(如左表或者右表)未匹配的行作为外部行添加到虚拟表VT2中,从而产生了虚拟表VT3
  • WHERE: 对 JOIN 之后的虚拟表VT3进行进一步的筛选,满足条件的留下生成虚拟表VT4
  • GROUP BY: 对虚拟表VT4进行分组,生成VT5
  • HAVING: 对分组后的VT5进行筛选,生成虚拟表VT6
  • SELECT: 选择 SELECT 指定的列,插入到虚拟表VT7中;
  • DISTINCT: 对虚拟表VT7中的数据进行去重,产生VT8
  • ORDER BY: 对虚拟表VT8的中的数据进行排序生成VT9
  • LIMIT: 取出VT9中指定行的数据,产生虚拟表VT10,并返回数据
Licensed under CC BY-NC-SA 4.0
皖ICP备20014602号
Built with Hugo
Theme Stack designed by Jimmy