SQL 中查询处理的逻辑顺序

/*(8)*/  SELECT /*9*/ DISTINCT /*11*/ TOP  
/*(1)*/  FROM 
/*(3)*/        JOIN 
/*(2)*/       ON 
/*(4)*/  WHERE 
/*(5)*/  GROUP BY 
/*(6)*/  WITH {CUBE | ROLLUP}
/*(7)*/  HAVING 
/*(10)*/ ORDER BY 
/*(11)*/ LIMIT 

处理查询的顺序和每个部分的描述。

VT 代表虚拟表,显示了在处理查询时如何生成各种数据

  1. FROM:在 FROM 子句的前两个表之间执行笛卡尔积(交叉连接),结果生成虚拟表 VT1。

  2. ON:ON 滤波器应用于 VT1。只有 TRUE 的行插入 VT2。

  3. OUTER(join):如果指定了 OUTER JOIN(而不是 CROSS JOIN 或 INNER JOIN),则保留的一个或多个未找到匹配项的表中的行将作为外行添加到 VT2 的行中,从而生成 VT3。如果 FROM 子句中出现两个以上的表,则在最后一个连接的结果和 FROM 子句中的下一个表之间重复应用步骤 1 到步骤 3,直到处理完所有表。

  4. WHERE:WHERE 过滤器应用于 VT3。只有 TRUE 的行插入 VT4。

  5. GROUP BY:VT4 中的行根据 GROUP BY 子句中指定的列列表进行分组排列。生成 VT5。

  6. CUBE | ROLLUP:超级组(组的组)被添加到 VT5 的行中,生成 VT6。

  7. HAVING:HAVING 过滤器应用于 VT6。只有 TRUE 的组才会插入 VT7。

  8. SELECT:处理 SELECT 列表,生成 VT8。

  9. DISTINCT:从 VT8 中删除重复的行。生成 VT9。

  10. ORDER BY:VT9 中的行根据 ORDER BY 子句中指定的列列表进行排序。生成游标(VC10)。

  11. TOP:从 VC10 的开头选择指定的行数或百分比。生成表 VT11 并将其返回给调用者。LIMIT 在一些 SQL 方言中具有与 TOP 相同的功能,例如 Postgres 和 Netezza。