SQL Server笔记 -- 第73章:排序/对行进行排序

73.1 基础用法

首先创建示例表:

sql 复制代码
-- 创建示例表
CREATE TABLE SortOrder (
  ID   INT IDENTITY PRIMARY KEY,
  Text VARCHAR(256)
)
GO

-- 插入测试数据
INSERT INTO SortOrder ([Text])
SELECT ('Lorem ipsum dolor sit amet, consectetur adipiscing elit')
UNION ALL
SELECT ('Pellentesque eu dapibus libero')
UNION ALL
SELECT ('Vestibulum et consequat est, ut hendrerit ligula')
UNION ALL
SELECT ('Suspendisse sodales est congue lorem euismod, vel facilisis libero pulvinar')
UNION ALL
SELECT ('Suspendisse lacus est, aliquam at varius a, fermentum nec mi')
UNION ALL
SELECT ('Praesent tincidunt tortor est, nec consequat dolor malesuada quis')
UNION ALL
SELECT ('Quisque at tempus arcu')
GO

检索数据时,如果不指定排序子句(ORDER BY),SQL Server 在任何时刻都不保证结果顺序。

没有 ORDER BY == 没有排序,这一点毫无疑问。

sql 复制代码
-- 看似按主键排序,实则无法保证永远如此;留在生产环境必出意外
SELECT * FROM SortOrder
GO

排序方向:

  • 升序(ASC,默认)
  • 降序(DESC)
sql 复制代码
-- 升序
SELECT * FROM SortOrder ORDER BY ID ASC
GO

-- 升序可省略 ASC
SELECT * FROM SortOrder ORDER BY ID
GO

-- 降序
SELECT * FROM SortOrder ORDER BY ID DESC
GO

对文本列排序时,顺序受排序规则(collation)影响。

排序会消耗资源,合理建立索引可提高性能。

可用伪随机方式打乱顺序:

sql 复制代码
SELECT * FROM SortOrder ORDER BY CHECKSUM(NEWID())
GO

在存储过程末尾固定排序,供前端直接调用:

sql 复制代码
CREATE PROCEDURE GetSortOrder
AS
SELECT * FROM SortOrder ORDER BY ID DESC
GO
EXEC GetSortOrder
GO

视图中的排序(不推荐):

sql 复制代码
-- 可能失效,依赖部署与更新方式
CREATE VIEW VwSortOrder1
AS
SELECT TOP 100 PERCENT * FROM SortOrder ORDER BY ID DESC
GO
SELECT * FROM VwSortOrder1
GO

-- 可行但不应使用
CREATE VIEW VwSortOrder2
AS
SELECT TOP 99999999 * FROM SortOrder ORDER BY ID DESC
GO
SELECT * FROM VwSortOrder2
GO

ORDER BY 可使用列名、别名或列序号:

sql 复制代码
SELECT * FROM SortOrder ORDER BY [Text]

-- 使用别名
SELECT ID,
       [Text] + ' (' + CAST(ID AS nvarchar(10)) + ')' AS Msg
FROM SortOrder
ORDER BY Msg

-- 使用列号(易出错,不建议生产使用)
SELECT * FROM SortOrder ORDER BY 2

73.2 使用 CASE 自定义排序

若需按自定义层次而非字母/数值排序,可用 CASE 赋予序号:

示例数据:

复制代码
Group
-------
Total
Young
MiddleAge
Old
Male
Female

默认按字母排序:

sql 复制代码
SELECT * FROM MyTable ORDER BY [Group]
-- 结果:Female, Male, MiddleAge, Old, Total, Young

使用 CASE 指定顺序:

sql 复制代码
SELECT * FROM MyTable
ORDER BY CASE [Group]
  WHEN 'Total'     THEN 10
  WHEN 'Male'      THEN 20
  WHEN 'Female'    THEN 30
  WHEN 'Young'     THEN 40
  WHEN 'MiddleAge' THEN 50
  WHEN 'Old'       THEN 60
END

结果按指定层次排序:

复制代码
Total
Male
Female
Young
MiddleAge
Old
相关推荐
XLYcmy2 小时前
智能体大赛 目录
数据库·ai·llm·prompt·agent·检索·万方
盟接之桥2 小时前
盟接之桥EDI软件:API数据采集模块深度解析,打造企业数据协同新引擎
java·运维·服务器·网络·数据库·人工智能·制造
苍何2 小时前
豆包还能这么玩?附 13 大隐藏玩法,效率起飞(建议收藏)
后端
苍何2 小时前
Kimi 版 OpenClaw 来了,5000+ Skills 随便用,确实给力!
后端
百锦再3 小时前
Jenkins 全面精通指南:从入门到脚本大师
运维·后端·python·servlet·django·flask·jenkins
forestsea3 小时前
优雅终结启动顺序噩梦:ObjectProvider —— Spring 4.3 开始引入
java·后端·spring
小楼v3 小时前
⭐解锁RAG与Spring AI的实战应用(万字详细教学与完整步骤流程实践)
java·后端·rag·spring ai·ai大模型应用
QQ24391973 小时前
语言在线考试与学习交流网页平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·spring boot·sql·学习·java-ee
毕设源码-小云学姐3 小时前
计算机毕业设计springboot医疗档案管理系统 基于 SpringBoot 的电子医疗档案管理系统的设计与实现 SpringBoot 框架下的医疗档案信息化管理系统开发
spring boot·后端·课程设计