当使用TOP N(不加ORDER BY)时,SQLSERVER不会对数据做任何分析,到了N个直接截断。

但如果你加上ORDER BY,也不一定会进行排序,因为SQLSERVER只在你WHERE子句限制的字段的值是不唯一的情况下排序。

我举个例:比如你有一个表如下:

名字   工资     ID

张三    500     0

李四    600     1

赵五    700     2

孙六    700     3

田七    700     4

王八    800     5

如果SQL语句是:

SELECT TOP 2 *

FROM 表名

WHERE 工资=700

则出来的结果是:

名字   工资     ID

赵五    700     2

孙六    700     3

若SQL换成:

SELECT TOP 2 *

FROM 表名

WHERE 工资=700

ORDER BY 工资 DESC

本以为这次孙六要排在赵五前面了,

结果查询出来的结果没有变化,

看了下执行计划:

发现根本没进行排序操作。

原来SQLSERVER也会偷懒,

发现WHERE子句中约束字段的值一样时,就跳过了排序!

为了进行验证,我又写了这样两句SQL:

SQL1:

SELECT TOP 4 *

FROM 表名

WHERE 工资>=700

查询结果是:

名字   工资     ID

赵五    700     2

孙六    700     3

田七    700     4

王八    800     5

SQL2:

SELECT TOP 4 *

FROM 表名

WHERE 工资>=700

ORDER BY 工资 DESC

查询结果是:

名字   工资     ID

王八    800     5

田七    700     4

孙六    700     3

赵五    700     2

 

很明显,赵五,孙六,田七都进行了倒叙。

posted on 2011-05-24 20:57  生产力  阅读(1816)  评论(2)    收藏  举报