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_id | first_name | last_name | salary |
|---|---|---|---|
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 3 | David | Johnson | 50000 |
| 4 | Alice | Brown | 80000 |
要按 salary(薪资)升序对员工进行排序,你可以使用以下查询:
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;结果将是:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 3 | David | Johnson | 50000 |
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 4 | Alice | Brown | 80000 |
由于 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_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 2 | Jane | Smith | 75000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |
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_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |
| 5 | Michael | Johnson | 55000 |
| 2 | Jane | Smith | 75000 |
结果将是:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |
| 5 | Michael | Johnson | 55000 |
| 2 | Jane | Smith | 75000 |
请注意,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_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 1 | John | Doe | 60000 |
| 5 | Michael | Johnson | 55000 |
| 3 | David | Johnson | 50000 |
| 2 | Jane | Smith | 75000 |
在这里,员工首先按 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_id | first_name | last_name | salary |
|---|---|---|---|
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 3 | David | Johnson | 50000 |
| 4 | Alice | Brown | 80000 |
| 6 | Bob | Wilson | NULL |
如果我们按薪资升序对员工进行排序:
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;结果将是:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 3 | David | Johnson | 50000 |
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 4 | Alice | Brown | 80000 |
| 6 | Bob | Wilson | NULL |
NULL 值出现在了最后。
要想改变这种行为,让 NULL 值出现在最前面,你可以使用 NULLS FIRST 选项:
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC NULLS FIRST;结果将是:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 6 | Bob | Wilson | NULL |
| 3 | David | Johnson | 50000 |
| 1 | John | Doe | 60000 |
| 2 | Jane | Smith | 75000 |
| 4 | Alice | Brown | 80000 |
类似地,如果想在降序排序时让 NULL 值出现在最后,你可以使用 NULLS LAST 选项(这其实是降序时的默认行为):
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC NULLS LAST;结果将是:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 4 | Alice | Brown | 80000 |
| 2 | Jane | Smith | 75000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |
| 6 | Bob | Wilson | NULL |
如果想在降序排序时让 NULL 值出现在最前面:
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC NULLS FIRST;结果将是:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 6 | Bob | Wilson | NULL |
| 4 | Alice | Brown | 80000 |
| 2 | Jane | Smith | 75000 |
| 1 | John | Doe | 60000 |
| 3 | David | Johnson | 50000 |