在 ON / WHERE 中应用条件语句
这里我已经解释了逻辑查询处理步骤。
参考:Inside Microsoft® 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:对 VT1 应用 ON 滤波器。仅将<join_condition>
TRUE 的行插入到 VT2。
OUTER (join):如果指定了 OUTER JOIN(与 CROSS JOIN 或 INNER JOIN 相对),则将保留表中的行或未找到匹配的表添加到 VT2 的行中作为外行,生成VT3。如果 FROM 子句中出现两个以上的表,则在最后一个连接的结果和 FROM 子句中的下一个表之间重复应用步骤 1 到 3,直到处理完所有表。
WHERE:将 WHERE 过滤器应用于 VT3。仅将<where_condition>
TRUE 的行插入到 VT4。
GROUP BY:VT4 中的行根据 GROUP BY 子句中指定的列列表分组排列。产生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 中应用条件语句在少数情况下不会产生太大影响。这取决于您连接了多少表以及每个连接表中可用的行数)