SQL Server Order By子句

在本教程中,将学习如何使用SQL Server ORDER BY子句按一列或多列对查询的结果集进行排序。

SQL Server ORDER BY子句简介

使用SELECT语句从表中查询数据时,不保证结果集中的行顺序。 这意味着SQL Server可以返回具有未指定行顺序的结果集。
保证结果集中的行已排序的方法是使用ORER BY子句。 以下是ORDER BY子句的语法:

SELECT
    select_list
FROM
    table_name
ORDER BY
    [column_name | expression] [ASC | DESC ]

在上面语法中,

  • column_name | expression - 指定要对查询结果集进行排序的列名或表达式。 如果指定多个列,则结果集按第一列排序,然后该排序结果集按第二列排序,依此类推。ORDER BY子句中出现的列必须对应于选择列表中的列或FROM子句中指定的表中定义的列。
  • ASC | DESC - 使用ASCDESC指定是否应按升序或降序对指定列中的值进行排序。ASC将结果从最低值排序到最高值,而DESC将结果集从最高值排序到最低值。如果未明确指定ASCDESC,则SQL Server将默认使用ASC来排序顺序。 此外,SQL Server将NULL视为最低值。

处理具有ORDER BY子句的SELECT语句时,ORDER BY子句是要处理的最后一个子句。

SQL Server ORDER BY子句示例

将使用示例数据库中的customers表进行演示。

1. 按升序对结果集进行排序

以下语句按名字按升序对客户列表进行排序:

SELECT
    first_name,
    last_name
FROM
    sales.customers
ORDER BY
    first_name;

执行上面查询语句,得到以下结果:

在此示例中,由于未指定ASCDESCORDER BY子句默认使用ASC

2. 按降序对结果集按一列排序

以下语句按名字降序对客户列表进行排序。

SELECT
 firstname,
 lastname
FROM
 sales.customers
ORDER BY
 first_name DESC;

执行上面查询语句,得到以下结果:

在此示例中,因为显式指定了DESC,所以ORDER BY子句按降序对first_name列中的值对结果集进行降序排序。

3. 按多列对结果集进行排序

以下语句检索客户的名字,姓氏和城市。 它首先按城市对客户列表进行排序,然后按名字排序。

SELECT
    city,
    first_name,
    last_name
FROM
    sales.customers
ORDER BY
    city,
    first_name;

执行上面查询语句,得到以下结果:

4. 按多列和不同顺序对结果集进行排序

以下语句按城市按降序对客户进行排序,之后按第一个名称按升序对排序结果进行排序。

SELECT
    city,
    first_name,
    last_name
FROM
    sales.customers
ORDER BY
    city DESC,
    first_name ASC;

执行上面查询语句,得到以下结果:

5. 按不在选择列表中的列对结果集进行排序

可以通过选择列表中未显示的列对结果集进行排序。 例如,以下语句按state对客户进行排序,即使state列未显示在选择列表中。

SELECT
    city,
    first_name,
    last_name
FROM
    sales.customers
ORDER BY
    state;

执行上面查询语句,得到以下结果:

请注意,state列在customers表中定义。 如果不是,那么查询将无效。

6. 按表达式对结果集进行排序

LEN()函数返回字符串的字符数。 以下语句使用ORDER BY子句中的LEN()函数来检索按名字长度排序客户列表。

SELECT
    first_name,
    last_name,
    LEN(first_name) as len_name
FROM
    sales.customers
ORDER BY
    LEN(first_name) DESC;

执行上面查询语句,得到以下结果:

7. 按列的序数位置排序

SQL Server允许根据选择列表中显示的列的序号位置对结果集进行排序。
以下语句按名字和姓氏对客户进行排序。 但是它没有显式指定列名,而是使用列的序号位置:

SELECT
    first_name,
    last_name
FROM
    sales.customers
ORDER BY
    1,
    2;

执行上面查询语句,得到以下结果:

在此示例中,1表示first_name列,2表示last_name列。

由于几个原因,在ORDER BY子句中使用列的序号位置是不推荐使用的。

  • 首先,表中的列没有序号位置,需要按名称引用。
  • 其次,当修改选择列表时,可能忘记在ORDER BY子句中进行相应的更改。

因此,最好始终在ORDER BY子句中显式指定列名。

在本教程中,学习了如何使用SQL Server ORDER BY子句按列升序或降序对结果集进行排序。


上一篇: SQL Server数据查询 下一篇: SQL Server连接表