首页 > 代码库 > 【SQL Server】系统学习之三:逻辑查询处理阶段-六段式

【SQL Server】系统学习之三:逻辑查询处理阶段-六段式

一、From阶段

针对连接说明:

1、笛卡尔积

2、on筛选器

插播:unknown=not unknuwn 缺失的值;

筛选器(on where having)把unknown当做FALSE处理,排除在筛选结果之外。如果比较两个null,结果是不相等的,false

check约束中当做true,例如要求某列大于0,当插入null时是成功的,认为null>0是ture。如果比较两个null,结果是相等的,这种比较在unique约束、集合运算(例如union 、except)、排序、分组,都认为是相等的。

3、添加外部行(外连接)

二、where

由于还未分组,不能使用聚合函数;还未select,不能使用select中指定的列别名。

三、group by

四、having

五、select阶段

1、聚合运算

2、discount排重

3、top

如果未指定order by,则返回的集是不确定的

当指定了with ties时,会检查最后一行,并返回和最后一行值相同的所有行。

六、order by

这一步返回的不再是有效的表,而是游标,这也是为什么改语句不能用在表表达式中的原因。(还记得表表达式吗?视图、内联表值函数、派生表、cte

例外情况,是和top搭配使用时,作为获取前n条的逻辑有限顺序,此时返回的行,并未排序,不保证顺序,这点需要注意。

如果不必要,不要轻易指定order by,会执行索引扫描或者执行sort运算符。

order by认为null是相等的。同时,null比已知值要小,会排在最前面。

 

延伸:

一、表运算符