一条 SQL 查询语句的执行顺序?

查询语句执行顺序

  1. FROM:对 FROM 子句中的左表<left_table>和右表<right_table>执行笛卡尔积(Cartesian product),生成虚拟表 VT1。
  1. ON:对虚拟表 VT1 应用 ON 筛选条件,只有符合<join_condition>的行才会被插入虚拟表 VT2 中。
  2. JOIN:如果使用了 OUTER JOIN(如 LEFT OUTER JOIN、RIGHT OUTER JOIN),则将保留表中未匹配的行作为外部行添加到虚拟表 VT2 中,生成虚拟表 VT3。如果 FROM 子句包含多个表,则对上一个连接生成的结果表 VT3 和下一个表重复执行步骤 1)~步骤 3),直到处理完所有的表。
  3. WHERE:对虚拟表 VT3 应用 WHERE 过滤条件,只有符合<where_condition>的记录才会被插入虚拟表 VT4 中。
  4. GROUP BY:根据 GROUP BY 子句中的列,对 VT4 中的记录进行分组操作,生成 VT5。
  5. CUBE|ROLLUP:对表 VT5 进行 CUBE 或 ROLLUP 操作,生成表 VT6。
  6. HAVING:对虚拟表 VT6 应用 HAVING 过滤器,只有符合<having_condition>的记录才会被插入虚拟表 VT7 中。
  7. SELECT:执行第二次 SELECT 操作,选择指定的列,并将结果插入虚拟表 VT8 中。
  8. DISTINCT:去除重复的数据,生成虚拟表 VT9。
  9. ORDER BY:对虚拟表 VT9 中的记录按照<order_by_list>进行排序操作,生成虚拟表 VT10。
  10. LIMIT:从虚拟表 VT10 中取出指定行的记录,生成虚拟表 VT11,并将结果返回给查询用户。

标签: java, Java面试题, MySQL, Java问题合集, MySQL面试题, Java编程, Java问题精选, Java常见问题