/*(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代表“虚拟表”,显示了在处理查询时如何产生各种数据
FROM:在FROM子句的前两个表之间执行笛卡尔乘积(交叉联接),结果生成了虚拟表VT1。
ON:ON滤镜应用于VT1。仅将TRUE的行插入VT2。
OUTER(联接):如果指定了OUTER JOIN(与CROSS JOIN或INNER JOIN相对),则将保留表中未找到匹配项的行作为外部行添加到VT2中的行中,生成VT3。如果FROM子句中出现两个以上的表,则在上一个联接的结果和FROM子句中的下一个表之间重复执行步骤1到3,直到处理完所有表为止。
哪里:WHERE过滤器应用于VT3。仅将TRUE所在的行插入VT4。
GROUP BY:根据GROUP BY子句中指定的列列表,将VT4中的行按组排列。生成VT5。
多维数据集| ROLLUP:将超组(组的组)添加到VT5的行中,从而生成VT6。
HAVING:HAVING过滤器应用于VT6。只有其TRUE的组才插入VT7。
SELECT:处理SELECT列表,生成VT8。
DISTINCT:从VT8中删除重复的行。生成VT9。
ORDER BY:VT9中的行根据ORDER BY子句中指定的列列表进行排序。生成一个游标(VC10)。
TOP:从VC10的开头选择指定的行数或百分比。表VT11生成并返回给调用方。在某些SQL方言(例如Postgres和Netezza)中,LIMIT具有与TOP相同的功能。