SQL(Structured Query Language)结构化查询语言执行,在我刚接触的时候始终不明白它的执行顺序因为它并不是按照我们写的那样执行,当了解了它的执行顺序后感觉写起来也清晰多了。
(8)SELECT (9)DISTINCT (11)<TOP NUM><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_CONDITON>
(10)ORDER BY <ORDER_BY_LIST>
- FROM : 对于FROM子句中的前两个表执行笛卡尔积(A_TABLE*B_TABLE)交叉连接,生成虚拟表VT1
- ON:对VT1应用ON筛选器。只有那些使<join_condition>真的行才被插入VT2.
- OUTER(JOIN) : 如果指定了OUTER JOIN 或(INNER JOIN),保留表(perserved table : 左外链接把左表标记为保留表,右外链接包右表标记为保留表,全外连接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个链接生成的结果表和下个表重复执行步骤1到步骤3,直到处理完所有表为止。
- WHERE :对VT3应用where筛选器。只有<where_condition>为true的行才被插入VT4.
- GROUP BY : 按照group by 子句中的列列表对VT4中的行进行分组,生成VT5.
- CUBE | ROLLUP : 把超组(suppergroups)插入VT5,生成VT6.
- HAVING : 对VT6应用筛选器。只有<having_condition>为true的组才会被插入VT7.
- SELECT : 处理SELECT列表,产生VT8.
- DISTINCT : 将重复的行从VT8中移除,产生VT9.
- ORDER BY : 将VT9中的行按order by子句中的列列表排序,生成游标(类似序列号)(VC10)
__注意:该步骤是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步骤区别于其他步骤的是该 步骤返回的不是有效的表而是返回一个游标。SQL是基于集合理论的。集合理论不会预先对它进行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象成为游标。因为这一步不返回表(而是返回游标),所以使用了ORDER BY 子句的查询不能用作 表表达式 (内联表值函数、子查询、派生表和共用表达式) 如:select * from (select id , name from stu order by orderid(返回的不是表而是游标)) as t 该语句将抛出错误 __- TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。