在ON / WHERE中应用条件语句
在这里,我已经解释了有关逻辑查询处理步骤。
参考:InsideMicrosoft®SQL Server™2005 T-SQL查询
发行者:Microsoft Press
Pub日期:2006年3月7日
打印ISBN-10:0-7356-2313-9
打印ISBN-13:978-0-7356-2313-2
网页:640
Microsoft®SQL Server™2005 T-SQL内部查询
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
与其他编程语言不同,SQL的第一个值得注意的方面是代码的处理顺序。在大多数编程语言中,代码是按照编写顺序进行处理的。在SQL中,要处理的第一个子句是FROM子句,而最先出现的SELECT子句几乎要最后处理。
每个步骤都会生成一个虚拟表,用作后续步骤的输入。这些虚拟表对调用者不可用(客户端应用程序或外部查询)。仅将最后一步生成的表返回给调用方。如果在查询中未指定某个子句,则仅跳过相应的步骤。
逻辑查询处理阶段的简要说明
如果现在对步骤的描述似乎没有多大意义,请不要担心。这些仅供参考。场景示例之后的各节将更详细地介绍这些步骤。
FROM:在FROM子句的前两个表之间执行笛卡尔乘积(交叉联接),结果生成了虚拟表VT1。
ON:ON滤镜应用于VT1。仅将<join_condition>
TRUE所在的行插入VT2。
OUTER(联接):如果指定了OUTER JOIN(与CROSS JOIN或INNER JOIN相对),则将保留表中未找到匹配项的行作为外部行添加到VT2中的行中,生成VT3。如果FROM子句中出现两个以上的表,则在上一个联接的结果与FROM子句中的下一个表之间重复执行步骤1至3,直到处理完所有表为止。
WHERE:WHERE过滤器应用于VT3。仅将<where_condition>
TRUE所在的行插入VT4。
GROUP BY:根据GROUP BY子句中指定的列列表,将VT4中的行按组排列。生成VT5。
多维数据集| ROLLUP:将超组(组的组)添加到VT5的行中,从而生成VT6。
HAVING:HAVING过滤器应用于VT6。只有其<having_condition>
TRUE的组才插入VT7。
SELECT:处理SELECT列表,生成VT8。
DISTINCT:从VT8中删除重复的行。生成VT9。
ORDER BY:VT9中的行根据ORDER BY子句中指定的列列表进行排序。生成一个游标(VC10)。
TOP:从VC10的开头选择指定的行数或百分比。表VT11生成并返回给调用方。
因此,(INNER JOIN)ON将在应用WHERE子句之前过滤数据(VT的数据计数将在此处减少)。随后的连接条件将与过滤后的数据一起执行,从而提高了性能。之后,只有WHERE条件将应用过滤条件。
(在少数情况下,在ON / WHERE中应用条件语句不会有太大区别。这取决于您已联接的表数量以及每个联接表中可用的行数)