PostgreSQL 教程

SQL ORDER BY 子句

对数据进行排序是数据库查询中至关重要的一环,它允许你以一种有意义且易于理解的顺序来呈现信息。SQL 中的 ORDER BY 子句提供了这种功能,使你能够根据一个或多个列,按升序或降序对查询结果进行排序。本章将详细探讨 ORDER BY 子句,涵盖其语法、在不同数据类型下的使用方法以及实际的演示示例。

1. 了解 ORDER BY 子句

ORDER BY 子句用于在 SELECT 语句中对结果集进行排序。默认情况下,它按升序对行进行排序。如果需要按降序排序,可以使用 DESC 关键字。

1.1 基础语法

ORDER BY 子句的基本语法如下:

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
  • SELECT column1, column2, ...: 指定你想要检索的列。
  • FROM table_name: 指定你想要从中检索数据的表。
  • ORDER BY column1, column2, ...: 指定你希望作为排序依据的一列或多列。
  • ASC: 指定升序排序(默认值)。
  • DESC: 指定降序排序。

2. 升序排序 (ASC)

升序排序将数据从最低值排列到最高值。对于数字列,这意味着从小到大;对于文本列,这意味着按字母顺序(A 到 Z);对于日期列,这意味着从最旧的日期到最新的日期。

示例:

假设我们有一个名为 employees(员工)的表,包含以下数据:

employee_idfirst_namelast_namesalary
1JohnDoe60000
2JaneSmith75000
3DavidJohnson50000
4AliceBrown80000

要按 salary(薪资)升序对员工进行排序,你可以使用以下查询:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;

结果将是:

employee_idfirst_namelast_namesalary
3DavidJohnson50000
1JohnDoe60000
2JaneSmith75000
4AliceBrown80000

由于 ASC 是默认设置,你也可以省略它:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary;

此查询将产生与上一个查询完全相同的结果。

3. 降序排序 (DESC)

降序排序将数据从最高值排列到最低值。对于数字列,这意味着从大到小;对于文本列,这意味着按反向字母顺序(Z 到 A);对于日期列,这意味着从最新日期到最旧日期。

示例:

要按 salary(薪资)降序对员工进行排序,你可以使用以下查询:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC;

结果将是:

employee_idfirst_namelast_namesalary
4AliceBrown80000
2JaneSmith75000
1JohnDoe60000
3DavidJohnson50000

4. 按多列排序

你可以按多个列对数据进行排序。排序操作将根据 ORDER BY 子句中指定列的先后顺序来执行。指定的第一个列是主排序键,第二个列是次排序键,以此类推。

示例:

让我们先按 last_name(姓氏)升序对 employees 表进行排序,然后再按 first_name(名字)升序排序。

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY last_name ASC, first_name ASC;

假设表中有以下数据(注意加入了两位姓氏同为 Johnson 的员工):

employee_idfirst_namelast_namesalary
4AliceBrown80000
1JohnDoe60000
3DavidJohnson50000
5MichaelJohnson55000
2JaneSmith75000

结果将是:

employee_idfirst_namelast_namesalary
4AliceBrown80000
1JohnDoe60000
3DavidJohnson50000
5MichaelJohnson55000
2JaneSmith75000

请注意,David Johnson 和 Michael Johnson 的排列顺序是由他们的名字(first_name)决定的,因为他们的姓氏(last_name)相同。

你也可以为不同的列混合使用升序和降序:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY last_name ASC, salary DESC;

结果将是:

employee_idfirst_namelast_namesalary
4AliceBrown80000
1JohnDoe60000
5MichaelJohnson55000
3DavidJohnson50000
2JaneSmith75000

在这里,员工首先按 last_name(姓氏)升序排序。在每个相同的姓氏组内,他们再按 salary(薪资)降序排列(Michael 的薪资高于 David,因此排在前面)。

5. 结合 WHERE 子句使用 ORDER BY

ORDER BY 子句通常与 WHERE 子句结合使用,以便只对过滤后的数据进行排序。在 SQL 语句的执行顺序中,会先执行过滤,再执行排序。

示例:

要找出薪资大于 60000 的员工,并按他们的姓氏升序排序:

SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > 60000
ORDER BY last_name ASC;

6. 处理 NULL 值

ORDER BY 处理 NULL(空值)的方式可能因数据库系统而异。在 PostgreSQL 中,默认情况下,当按升序排序时,NULL 值被视为高于任何其他值

示例:

让我们向 employees 表添加一位薪资为 NULL 的新员工:

employee_idfirst_namelast_namesalary
1JohnDoe60000
2JaneSmith75000
3DavidJohnson50000
4AliceBrown80000
6BobWilsonNULL

如果我们按薪资升序对员工进行排序:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;

结果将是:

employee_idfirst_namelast_namesalary
3DavidJohnson50000
1JohnDoe60000
2JaneSmith75000
4AliceBrown80000
6BobWilsonNULL

NULL 值出现在了最后。

要想改变这种行为,让 NULL 值出现在最前面,你可以使用 NULLS FIRST 选项:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC NULLS FIRST;

结果将是:

employee_idfirst_namelast_namesalary
6BobWilsonNULL
3DavidJohnson50000
1JohnDoe60000
2JaneSmith75000
4AliceBrown80000

类似地,如果想在降序排序时NULL 值出现在最后,你可以使用 NULLS LAST 选项(这其实是降序时的默认行为):

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC NULLS LAST;

结果将是:

employee_idfirst_namelast_namesalary
4AliceBrown80000
2JaneSmith75000
1JohnDoe60000
3DavidJohnson50000
6BobWilsonNULL

如果想在降序排序时让 NULL 值出现在最前面:

SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC NULLS FIRST;

结果将是:

employee_idfirst_namelast_namesalary
6BobWilsonNULL
4AliceBrown80000
2JaneSmith75000
1JohnDoe60000
3DavidJohnson50000