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();
这样,每次返回的结果集顺序都不一样。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器