SQL Server ORDER BY

17 Mar 2025 | 5 分钟阅读

ORDER BY 子句用于根据给定的列或列列表,以升序或降序排列表的数据。 它通常与 SELECT 语句一起使用,因为它返回的记录没有按特定顺序排序。 这意味着 SQL Server 以未指定的顺序生成输出。 但是,使用 ORDER BY 子句可保证输出中的记录按升序或降序排序。 此子句允许通过定义单个或多个列来对表进行排序。

语法

以下是说明 SQL Server 中 ORDER BY 子句的语法

上面语法参数的说明如下

Column_lists: 它指示我们要检索到结果集中的列的名称。

Table_name: 它指示我们要从中检索列的表的名称。 我们必须在 FROM 子句中提供至少一个表名。

Conditions: 这是一个可选参数,将用于过滤表记录。

column_name [ASC | DESC]: 它指示要排序的表的列的名称。 ASC 关键字是可选的,但如果定义,它会将输出按升序排序(从最低到最高)。 DESC 关键字是可选的,但如果定义,它会将输出按降序排序(从最高到最低)。

如果我们不定义 ASC 或 DESC 关键字,SQL Server 将使用 ASC 作为默认排序顺序。 SQL Server 认为 NULL 值为最低。 此外,ORDER BY 子句是在处理带有 ORDER BY 子句的 SELECT 语句时要考虑的最后一个子句。

ORDER BY 子句的示例

让我们通过实际的几个例子来了解 ORDER BY 子句在 SQL Server 中的工作方式。 在这里,我们将使用表 employee_info 来演示此子句。 employee_info 表包含以下记录

SQL Server ORDER BY

示例1: 以下语句说明了 ORDER BY 子句,而没有指定任何排序顺序。 在这里,我们将指定 'salary' 列来对表进行排序。

执行该语句将返回以下输出,我们看到该表是基于 salary 列排序的。 由于我们没有指定排序顺序,SQL Server 将按默认顺序对表进行排序

SQL Server ORDER BY

示例2: 此示例将基于单个列按降序对结果集进行排序。 以下语句通过使用雇员姓名列按降序对 employee_info 表进行排序

执行该语句将显示以下输出。 由于我们显式指定了 DESC 关键字,因此 SQL Server 基于姓名值按降序对结果集进行了排序。

SQL Server ORDER BY

示例3: 此示例将基于多个列对结果集进行排序。 以下语句将返回雇员的姓名、职业薪水。 它首先按salary 列对雇员列表进行排序,然后按name 列进行排序。

执行该语句将生成以下结果集

SQL Server ORDER BY

示例4: 此示例将基于多个列和不同的顺序对结果集进行排序。 以下语句将返回雇员的姓名、职业和薪水。 它首先按薪水列按降序对雇员列表进行排序,然后按姓名按升序对已排序的结果集进行排序。

执行该语句将生成以下结果集

SQL Server ORDER BY

示例5: 此示例将基于 SELECT 列表中未定义的列对结果进行排序。 因为在某些情况下,用于对结果进行排序的列名不会出现在 select 列表中。 以下语句基于工作时间对雇员进行排序,即使 working_hours 列未在 select 列表中列出。

应该注意的是,工作时间列是在 employee_info 表中定义的。 否则,我们将有一个无效的查询。 现在,执行查询以显示结果

SQL Server ORDER BY

示例6: 此示例将基于定义的表达式对结果集进行排序。 以下示例使用 LEN() 函数,该函数返回字符串的字符数。 在这里,我们在 ORDER BY 子句中使用此函数来检索按其姓名长度排序的雇员信息。

此查询将生成以下输出

SQL Server ORDER BY

示例7: 此示例将基于列的序号位置对表进行排序。 我们这样做是因为 SQL Server 允许我们按 SELECT 列表中的列的序号位置对结果进行排序。

给定的查询通过指定 nameoccupation 列的序号位置而不是显式指定列名来对 employee_info 表名称进行排序

执行该语句将显示以下结果集

SQL Server ORDER BY

在该语句中,name 列由 1 表示,occupation 列由 2 表示。此语句已成功执行,但 DBA 认为在 ORDER BY 子句中使用列的序号位置是不好的编程实践。 一些流行的原因如下

  • 表的列没有序号位置,必须通过它们的名称来引用。
  • 当我们编辑 select 列表时,可能会忘记更新 ORDER BY 子句中的相应更改。

因此,建议始终在 ORDER BY 子句中直接指定列名,以消除未来的困难。

ORDER BY 子句中的 OFFSET 和 FETCH 选项

OFFSET 选项用于 ORDER BY 子句中,以消除从起始记录 (TOP) 开始的记录数。 这意味着 OFFSET 指定了从结果集中返回行的起始点。

ORDER BY 子句中的 FETCH 选项用于指定在查询中处理 OFFSET 子句后返回的行数。

示例

假设我们要获取从第 3 个记录开始到接下来的四个行的雇员记录。 通过使用 OFFSET 和 FETCH 子句可以轻松检索它。 这是查询

执行该语句将返回以下输出,其中 OFFSET 3 跳过三个行,而 FETCH 4 ROWS ONLY 显示所需的结果。

SQL Server ORDER BY

本文将深入解释 SQL Server 中的 ORDER BY 子句。 在这里,我们学习了 ORDER BY 子句是什么,如何在不同的情况下使用它,以及 OFFSET 和 FETCH 选项如何详细地与此子句一起工作。


下一个主题SQL Server HAVING