7.2 SQL Server数据排序
SQL Server ORDER BY
SQL Server ORDER BY子句简介
当使用SELECT
语句从表中查询数据时,结果集中的行顺序无法保证。这意味着SQL Server可以返回未指定行顺序的结果集。
唯一可以保证返回有顺序的结果集是使用ORDER BY
子句,语法如下:
SELECT | |
select_list | |
FROM | |
table_name | |
ORDER BY | |
column_name | expression [ASC | DESC ]; |
其中:
column_name | expression
首先,指定要对查询结果集进行排序的列名或表达式。如果指定多列,结果集将按第一列排序,然后按第二列排序,依此类推。
ASC | DESC
其次,使用ASC
或DESC
指定指定列中的值应按升序还是降序排序。
默认是ASC
,如果是值为NULL
,则视为最低值。
在处理有ORDER BY
子句的查询语句时,ORDER BY
通常是最后处理。
ORDER BY示例
存在如下学生表:
A)按一列升序排序
下列语句把结果集通过学生的年龄进行升序排序:
select | |
* | |
from | |
dbo.Students | |
order by | |
Age; |
本例中,没有指定ASC
或DESC
,ORDER BY
默认使用ASC
;
B)按一列降序排序
下列语句把结果集通过学生的年龄进行降序排序:
select | |
* | |
from | |
dbo.Students | |
order by | |
Age DESC; |
在本例中,由于我们显式指定了DESC
,ORDER BY
子句按Age
列中的值按降序对结果集进行排序。
C)按多列对结果集排序
下面的语句查询学生的Id
、名字、年龄。它先按年龄排序,然后按学号排序(年龄相同的再按照学号排序)。
select | |
Id, | |
NickName, | |
StudentNo, | |
Age | |
from | |
dbo.Students | |
order by | |
Age, | |
StudentNo |
D)按多列和不同顺序对结果集排序
这次,我们先把结果集按照年龄降序排列,然后年龄相同的再按照学号升序排列:
select | |
Id, | |
NickName, | |
StudentNo, | |
Age | |
from | |
dbo.Students | |
order by | |
Age DESC, | |
StudentNo ASC |
E)按不在SELECT
列表中的列对结果集排序
可以按未出现在选择列表中的列对结果集进行排序。例如,以下语句按学生班级名ClassName
进行排序,即使班级名ClassName
未显示在SELECT
列表中。
select | |
Id, | |
NickName, | |
StudentNo, | |
Age | |
from | |
dbo.Students | |
order by | |
ClassName |
F)按表达式对结果集排序
LEN()
返回字符串中的字符数。下面使用ORDER BY
子句中的LEN()
函数检索按名字长度排序的客户列表:
select | |
* | |
from | |
dbo.Students | |
order by | |
LEN(NickName) ASC; |
结果中,名字越短的会显示在前面
G)按列的顺序位置排序
SQL Server允许您根据SELECT
列表中显示的列的顺序位置对结果集进行排序。
下列语句先对SELECT
中的Age
进行排序,然后再对StudentNo
进行排序:
select | |
Id, | |
Age, | |
StudentNo | |
from | |
dbo.Students | |
order by | |
2 ASC,--对应StudentNo, | |
3 DESC;--对应Age |
这个例子,先是按照年龄进行升序,然后年龄相同的再按照学号进行降序。
H)ORDER BY GUID
在SQL Server中,如果想对结果集进行随机排序,可以使用如下方式:
select | |
Id, | |
Age, | |
StudentNo | |
from | |
dbo.Students | |
order by | |
NEWID(); |
这样,每次返回的结果集顺序都不一样。