第一小节.Logical Query Processing Phases
本节介绍查询语法,开始我将简要介绍每一步骤,然后将在每一小节详细的介绍每一个步骤,并举例说明。
Listing 1-1. Logical query processing step numbers
(8) SELECT (9) DISTINCT (11) <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 却几乎在最后才被处理。
每一个步骤生成一个中间虚拟表,作为下一个步骤的输入,而这些虚拟表对于用户程序和外部调用者不可见,仅最后一步生成的表才返回给调用者,在一个查询中假如无法区分某个从句,对应的步骤将简单的跳过。
下面将简要介绍每个步骤:
别太担心每一步骤的描述是否合理,这里仅举例说明,之后的文章将详细的介绍每一个步骤。
1. FROM: 对于最先连接的两个表,返回两个表的笛卡尔积,返回虚拟表VT1.
2. ON: ON作为过滤器,将返回VT1中满足条件的行,塞入表VT2中.
3. OUTER (join): 如果指明是OUTER JOIN,则将返回外部表符合条件的行,而内部表假如没有记录,则增加到其中,返回虚拟表VT3.如果FROM子句中有两个以上表,则重复执行步骤1到步骤3的动作,前两个表输出符合条件的记录,然后和下一个表连接,直到所有的FROM子句处理完毕.(INNER JOIN 和 CROSS JOIN 则类似).
4. WHERE: WHERE过滤虚拟表VT3中的符合条件的数据,塞入表VT4中.
5. GROUP BY: 虚拟表VT4中的行将按照GROUP BY中的列分组,返回虚拟表VT5.
6. CUBE | ROLLUP: 分组以后继续分组,生成虚拟表VT6.
7. HAVING: 过滤VT6中符合条件的分组到虚拟表VT7.
8. SELECT: 返回相应的Column到虚拟表 VT8.
9. DISTINCT: VT8重复行将删除. 生成虚拟表VT9.
10. ORDER BY: 虚拟表VT9中的行将按照ORDER BY 子句排序,生成虚拟光标VC10.
TOP: 指明多少行或者多少百分比的数据将返回.
发表于 @ 2008年10月06日 04:15:00 | 评论( loading... ) | 举报| 收藏