SQL ORDER BY

摘要:在本教程中,您将学习如何使用 SQL ORDER BY 子句,根据一个或多个行的值,按升序或降序对结果集进行排序。

SQL ORDER BY 子句简介 #

ORDER BYSELECT 语句的一个可选子句。ORDER BY 子句允许您按一个或多个排序表达式,以升序和/或降序对结果集进行排序。

以下是 ORDER BY 子句的语法:

SELECT
  select_list
FROM
  table_name
ORDER BY
  sort_expression [ASC | DESC];Code language: SQL (Structured Query Language) (sql)

在此语法中:

  • 首先,在 ORDER BY 子句中指定一个排序表达式 (sort_expression),您希望根据它来对结果集进行排序。sort_expression 可以是表列,也可以是涉及表列的表达式。
  • 其次,使用 ASC 按升序对结果集进行排序,使用 DESC 按降序对结果集进行排序。

ASCDESC 分别代表升序(ascending)和降序(descending)。

ORDER BY 子句默认使用 ASC 选项。这意味着,如果您没有指定 ASCDESCORDER BY 子句会按 sort_expression 以升序对结果集中的行进行排序。

请注意,如果您不指定 ORDER BY 子句,SELECT 语句将不会对结果集进行排序。这意味着结果集中的行没有特定的顺序。

ORDER BY 子句允许您按多个表达式对结果集中的行进行排序。在这种情况下,您需要在 ORDER BY 子句中使用逗号分隔的排序表达式列表:

SELECT
  select_list
FROM
  table_name
ORDER BY
  sort_expression_1 [ASC | DESC],
  sort_expression_2 [ASC | DESC];Code language: SQL (Structured Query Language) (sql)

在此语法中,ORDER BY 子句首先按 sort_expression_1 对结果集进行排序,然后按 sort_expression_2 对已排序的结果集进行排序。

数据库系统按以下顺序评估带有 ORDER BY 子句的 SELECT 语句:

  • FROM
  • SELECT
  • ORDER BY

由于数据库系统在 SELECT 子句之后评估 ORDER BY 子句,因此您可以在 ORDER BY 子句中使用列别名。

SQL ORDER BY 子句示例 #

我们将使用示例数据库中的 employees 表进行演示。

employees_table

按单列对行进行排序的示例 #

以下示例使用 ORDER BY 子句按名字(first name)的字母顺序对员工进行排序:

SELECT
  employee_id,
  first_name,
  last_name
FROM
  employees
ORDER BY
  first_name;Code language: SQL (Structured Query Language) (sql)

 

试一试

输出

 employee_id | first_name  |  last_name
-------------+-------------+-------------
         121 | Adam        | Fripp
         103 | Alexander   | Hunold
         115 | Alexander   | Khoo
         193 | Britney     | Everett
         104 | Bruce       | Ernst
...

在此示例中,ORDER BY 子句根据 first_name 列中的值对结果集的行进行排序。

按多列对行进行排序 #

以下示例使用 ORDER BY 子句按名字(first name)升序和姓氏(last name)降序对员工进行排序:

SELECT
  employee_id,
  first_name,
  last_name
FROM
  employees
ORDER BY
  first_name,
  last_name DESC;Code language: SQL (Structured Query Language) (sql)

试一试

输出

 employee_id | first_name  |  last_name
-------------+-------------+-------------
         121 | Adam        | Fripp
         115 | Alexander   | Khoo
         103 | Alexander   | Hunold
         193 | Britney     | Everett
         104 | Bruce       | Ernst
         179 | Charles     | Johnson
...

在此示例中,ORDER BY 子句首先按名字升序对行进行排序,然后按姓氏降序对已排序的结果集进行排序。

请注意结果集中两位员工 Alexander KhooAlexander Hunold 位置的变化。

按数值列对行进行排序的示例 #

以下示例使用 ORDER BY 子句按薪水从高到低对员工进行排序:

SELECT
  employee_id,
  first_name,
  last_name,
  salary
FROM
  employees
ORDER BY
  salary DESC;Code language: SQL (Structured Query Language) (sql)

试一试

输出

 employee_id | first_name  |  last_name  |  salary
-------------+-------------+-------------+----------
         100 | Steven      | King        | 24000.00
         101 | Neena       | Kochhar     | 17000.00
         102 | Lex         | De Haan     | 17000.00
         145 | John        | Russell     | 14000.00
         146 | Karen       | Partners    | 13500.00
         201 | Michael     | Hartstein   | 13000.00

按日期对行进行排序的示例 #

除了字符和数值数据,您还可以使用 ORDER BY 子句按日期对行进行排序。

例如,以下语句使用 ORDER BY 子句按入职日期从早到晚对员工进行排序:

SELECT
  first_name,
  last_name,
  hire_date
FROM
  employees
ORDER BY
  hire_date;Code language: SQL (Structured Query Language) (sql)

试一试

输出

 first_name  |  last_name  | hire_date
-------------+-------------+------------
 Steven      | King        | 1987-06-17
 Jennifer    | Whalen      | 1987-09-17
 Neena       | Kochhar     | 1989-09-21
 Alexander   | Hunold      | 1990-01-03
 Bruce       | Ernst       | 1991-05-21
 Lex         | De Haan     | 1993-01-13

要按入职日期降序对员工进行排序,您可以使用以下查询:

SELECT
  first_name,
  last_name,
  hire_date
FROM
  employees
ORDER BY
  hire_date DESC;Code language: SQL (Structured Query Language) (sql)

试一试

输出

 first_name  |  last_name  | hire_date
-------------+-------------+------------
 Charles     | Johnson     | 2000-01-04
 Luis        | Popp        | 1999-12-07
 Karen       | Colmenares  | 1999-08-10
 Kimberely   | Grant       | 1999-05-24
 Diana       | Lorentz     | 1999-02-07
...

对 NULL 进行排序 #

在 SQL 中,NULL 是一个标记,表示数据缺失或值未知。NULL 很特殊,因为您不能将其与任何值进行比较。

如果要按包含 NULL 的列对行进行排序,您可以选择将 NULL 放在其他常规值之前或之后。

要将 NULL 放在其他值之前,请在 ORDER BY 子句中使用 NULLS FIRST 选项:

ORDER BY sort_expression NULLS FIRSTCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

如果要将 NULL 放在其他常规值之后,请使用 NULLS LAST 选项:

ORDER BY sort_expression NULLS LASTCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

以下查询使用带 NULLS FIRST 选项的 ORDER BY 子句将 NULL 放在其他值之前:

SELECT
  first_name,
  phone_number
FROM
  employees
ORDER BY
  phone_number NULLS FIRST;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

试一试

输出

 first_name  | phone_number
-------------+--------------
 John        | NULL
 Charles     | NULL
 Kimberely   | NULL
 Jack        | NULL
 Jonathon    | NULL
 Karen       | NULL
 Jennifer    | 515.123.4444
 Steven      | 515.123.4567
...Code language: plaintext (plaintext)

以下查询使用带 NULLS LAST 选项的 ORDER BY 子句将 NULL 放在其他值之后:

SELECT
  first_name,
  phone_number
FROM
  employees
ORDER BY
  phone_number NULLS LAST;Code language: SQL (Structured Query Language) (sql)

试一试

输出

 first_name  | phone_number
-------------+--------------
 ...
 Irene       | 650.124.1224
 Sarah       | 650.501.1876
 Britney     | 650.501.2876
 Kimberely   | NULL
 Jack        | NULL
 Jonathon    | NULL
 Karen       | NULL
 John        | NULL
 Charles     | NULLCode language: plaintext (plaintext)

摘要 #

  • 使用 ORDER BY 子句对结果集中的行进行排序。
  • 使用 ASC 选项按升序排序行,使用 DESC 选项按降序排序行。
  • 使用 NULLS FIRSTNULL 放在其他非 NULL 值之前,使用 NULLS LASTNULL 放在之后。

数据库 #

测验 #

本教程是否有帮助?
© .