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(联接):如果指定了OUTER JOIN(与CROSS JOIN或INNER JOIN相对),则将保留表中未找到匹配项的行作为外部行添加到VT2中的行中,生成VT3。如果FROM子句中出现两个以上的表,则在上一个联接的结果和FROM子句中的下一个表之间重复执行步骤1到3,直到处理完所有表为止。

  4. 哪里:WHERE过滤器应用于VT3。仅将TRUE所在的行插入VT4。

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

  6. 多维数据集| 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生成并返回给调用方。在某些SQL方言(例如Postgres和Netezza)中,LIMIT具有与TOP相同的功能。