SQL SERVER 中 order by 字句的使用
时间:2011-01-08 来源:EIJ_GNEP
我看书比较慢,今天刚看完 order by 字句的用法,觉得很深刻,所以动手写的详细一点。
1) 在讨论 order by 之前,首先我们要讨论一下 SQL SERVER 数据库中表数据是如何存放的。
a) SQL SERVER 中,表是数据行的集合,而集合是没有顺序的,所以表中行数据的存放,是零散的。而各个行中的各个列的顺序是一致 的。
2) 接着,我们来讨论一下表表达式。
a) 表表达式包括:视图、内联表值函数、派生表、公用表表达式(CTE)
b) 表表达式是集合,数据行是无序的
3) 现在,我们来讨论 order by 字句。
a) 与其他的阶段,如 join、where 不同, order by 字句返回的不是表,而是一个对象,这个对象里的各个行数据是按照某种顺序排列的,SQL SERVER 中称之为“游标”,所以不能用含有 order by 字句的子查询来定义表表达式。
b) 当 order by 字句与 top 连用时,如果把这个 select 语句放在表表达式的定义中时, order by 作为 top 选择前 n 行数据的一种依据,而不是排序用,定义得到的表表达式中的数据也是无序的
c) order by 字句与 distinct 之间的注意事项:
当 select 语句中没有 distinct 子过程时,order by 字句可以使用 select 子过程的输入和输出(筛选或未筛选的或取别名的字段),即 vt4 和 vt5,因为此时,向 select 字句中添加表达式不会影响返回的行数;而如果指定了 distinct 字句,则使用 order by 字句时只能使用 select 子过程的输出 vt5。
如:select bgqx,bz,bzrq from fil23 order by copy;(通过)
select distinct bgqx,bz,bzrq from fil23 order by copy;(报错,提示“如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中”)
哪位路过的大虾如果看出点毛病,拜求指点。