16-查询语句的执行顺序

1. SELECT 语句完整的执行顺序

  1. FROM 子句组装来自不同数据源的数据
  2. WHERE 子句基于指定的条件对记录行进行筛选
  3. GROUP BY 子句将数据划分为多个分组
  4. 使用聚集函数进行计算
  5. 使用 HAVING 子句筛选分组
  6. 计算所有的表达式
  7. SELECT 的字段
  8. 使用 ORDER BY 对结果集进行排序

2. 查询中的筛选条件分为两类

  • 分组前筛选
    • [数据源] 原始表
    • [关键字] WHERE
    • [位置 / 执行顺序] GROUP BY 子句 之前
  • 分组后筛选
    • [数据源] 分组后的结果集
    • [关键字] HAVING
    • [位置 / 执行顺序] GROUP BY 子句 之后
  • 二者作用对象不同
    • WHERE 子句作用于基本表或视图,从中选择满足条件的元组
    • HAVING 短语作用于组,从中选择满足条件的组

3. 虚拟表

每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只有最后一步生成的表才会会给调用者。如果没有在查询中指定某一个子句,将跳过相应的步骤。

key description
FROM 对 FROM 子句中的前两个表执行笛卡尔积(交叉联接),生成虚拟表 VT1。
ON 对 VT1 应用 ON 筛选器,只有那些使为真才被插入到 TV2。
OUTER (JOIN) 如果指定了 OUTER JOIN (相对于 CROSS JOIN 或 INNER JOIN),保留表中未找到匹配的行将作为外部行添加到 VT2,生成 TV3。如果 FROM 子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行 step1 到 step3,直到处理完所有的表位置。
WHERE 对 TV3 应用 WHERE 筛选器,只有使为 true 的行才插入 TV4。
GROUP BY 按 GROUP BY 子句中的列列表对 TV4 中的行进行分组,生成 TV5。
CUTE/ROLLUP 把超组插入 VT5,生成 VT6。
HAVING 对 VT6 应用 HAVING 筛选器,只有使为 true 的组插入到 VT7。
SELECT 处理 SELECT 列表,产生 VT8。
DISTINCT 将重复的行从 VT8 中删除,产生 VT9。
ORDER BY 将 VT9 中的行按 ORDER BY 子句中的列表顺序,生成一个游标(VC10)。
TOP 从 VC10 的开始处选择指定数量或比例的行,生成表 TV11,并返回给调用者。
原文地址:https://www.cnblogs.com/liujiaqi1101/p/14783571.html