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