数据库逻辑查询各个阶段(SELECT,ORDER BY阶段)

步骤5:SELECT阶段

虽然SELECT子句出现在查询的最前面,但却放在第五步处理。

步骤5-1:计算表达式

SELECT列表中的表达式可以返回上一步得到的虚拟表的基础列,也可以是对这些基础列的操作。如果查询是一个聚合查询,就只能引用上一步返回的虚拟表中的组信息。如果要引用原始信息,就必须对它们进行聚合运算。这个阶段得到的是虚拟表VT5

步骤5-2:应用Distinct子句

如果在查询中指定了Distinct子句,将从上一句返回的虚拟表中删除重复的行,并生成虚拟表VT5-2

步骤5-3:应用Top选项

Top选项是T-SQL特有的一项功能,允许指定要返回的指定行数或百分比,根据查询的Order by子句来选择指定的数量的行。最终生成虚拟表VT5-3

如果没有指定Order By子句或者未指定With Ties选项,或是根本没有指定Order By子句,那么Top查询就是非确定的。也就是说,返回的行只是SQL Server碰巧在物理上最先访问到的行,因此可能会产生不同的结果,但都可以认为是正确的。

 

步骤5:ORDER BY阶段

这一步按Order By子句中的列名列表对上一步返回的行进行排序,返回游标VT6。Order By子句是唯一可以重用SELECT列表中创建列名的步骤。

如果指定了Distinct,则Order By子句中的表达式只能访问上一步返回的虚拟表VT5。如果没有指定Distinct则可以指定任何在Select子句中的表达式。

如果查询中带有Order By子句,则不能用这样的查询来定义表表达式。表表达式包括:视图,内联表值函数,派生表和公用表表达式(CTE)。

除非真的需要有序行,否则不要指定Order By子句,因为排序需要耗费一定的资源。SQL Server需指定有序的索引扫描或sort运算符。

Order By子句认为两个NULL值是相等的。也就是说所有的NULL值是会排序到一起。T-SQL认为NULL值比已知值小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值