SQL - ORDER BY 子句



SQL ORDER BY 子句

SQL 的ORDER BY子句用于根据一个或多个列对数据进行升序或降序排序。此子句可以按单个列或多个列排序数据。当您需要分层排序数据(例如按州、城市,然后按人员姓名排序)时,按多个列排序非常有用。

ORDER BY 用于 SQL SELECT 语句,通常在 WHERE、HAVING 和 GROUP BY 子句之后指定。

以下是关于 ORDER BY 子句的重要要点:

  • 某些数据库默认按升序排序查询结果。
  • 要按升序排序数据,我们使用关键字ASC
  • 要按降序排序数据,我们使用关键字DESC

除了按升序或降序排序记录外,ORDER BY 子句还可以按首选顺序对数据库表中的数据进行排序。

此首选顺序可能不会按任何标准顺序(如字母顺序或词法顺序)对表的记录进行排序,但它们可以根据外部条件进行排序。

例如,在包含组织客户详细信息的 CUSTOMERS 表中,可以根据他们所在城市的居民人口对记录进行排序。这不需要按字母顺序排序,而是需要使用CASE语句手动定义顺序。

语法

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

SELECT column-list
FROM table_name
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

其中,column-list 是我们要检索的列的列表;ASC 或 DESC 指定排序顺序。

注意:我们可以在 ORDER BY 子句中使用多个列,但是我们需要确保我们用于排序的列在 column-list 中指定。

带有 ASC 的 ORDER BY 子句

我们可以通过指定ASC作为排序顺序,使用SQL ORDER BY子句按升序(基于一个或多个列)对查询的结果集进行排序。ASC 是此子句的默认排序顺序,即在使用 ORDER BY 子句时,如果您没有显式指定排序顺序,则数据将按升序排序。

示例

假设我们已使用 CREATE TABLE 语句在 MySQL 数据库中创建了一个名为 CUSTOMERS 的表,如下所示:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

以下查询使用 INSERT 语句将值插入此表:

insert INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

获得的表如下所示:

ID 姓名 年龄 地址 薪水
1 Ramesh 32 艾哈迈达巴德 2000.00
2 Khilan 25 德里 1500.00
3 Kaushik 23 科塔 2000.00
4 Chaitali 25 孟买 6500.00
5 Hardik 27 博帕尔 8500.00
6 Komal 22 海得拉巴 4500.00
7 Muffy 24 因多尔 10000.00

在以下查询中,我们根据列 NAME 按升序对 CUSTOMERS 表的记录进行排序:

SELECT * FROM CUSTOMERS ORDER BY NAME ASC;

输出

这将产生以下结果:

ID 姓名 年龄 地址 薪水
4 Chaitali 25 孟买 6500.00
5 Hardik 27 博帕尔 8500.00
3 Kaushik 23 科塔 2000.00
2 Khilan 25 德里 1500.00
6 Komal 22 海得拉巴 4500.00
7 Muffy 24 因多尔 10000.00
1 Ramesh 32 艾哈迈达巴德 2000.00

带有 DESC 的 ORDER BY 子句

要按降序(基于一个或多个列)对查询的结果集进行排序,我们需要使用 ORDER BY 子句,并指定 DESC 作为排序顺序。

示例

以下查询根据客户名称的降序对 CUSTOMER 表的记录进行排序:

SELECT * FROM CUSTOMERS ORDER BY NAME DESC;

输出

这将产生以下结果:

ID 姓名 年龄 地址 薪水
1 Ramesh 32 艾哈迈达巴德 2000.00
7 Muffy 24 因多尔 10000.00
6 Komal 22 海得拉巴 4500.00
2 Khilan 25 德里 1500.00
3 Kaushik 23 科塔 2000.00
5 Hardik 27 博帕尔 8500.00
4 Chaitali 25 孟买 6500.00

多列 ORDER BY 子句

我们可以使用 ORDER BY 子句按多个(多于一个)列对查询的结果集进行排序。当按多个列排序时,排序按 ORDER BY 子句中指定的顺序进行。换句话说,表将根据第一列(在查询中指定)进行排序,然后是第二列,依此类推。

示例

在以下查询中,我们从 CUSTOMERS 表中检索所有记录,并首先按其地址升序排序,然后按其薪水降序排序:

SELECT * FROM CUSTOMERS ORDER BY AGE ASC, SALARY DESC;

输出

以下是产生的结果:

ID 姓名 年龄 地址 薪水
6 Komal 22 海得拉巴 4500.00
3 Kaushik 23 科塔 2000.00
7 Muffy 24 因多尔 10000.00
4 Chaitali 25 孟买 6500.00
2 Khilan 25 德里 1500.00
5 Hardik 27 博帕尔 8500.00
1 Ramesh 32 艾哈迈达巴德 2000.00

带有 WHERE 子句的 ORDER BY

我们还可以将 WHERE 子句与 ORDER BY 子句一起使用,以对满足某些条件的行进行排序。当我们想要根据特定条件对表中的数据子集进行排序时,这非常有用。

示例

现在,我们从 CUSTOMERS 表中检索客户年龄为 25 的所有记录,并根据其名称的降序对其进行排序:

SELECT * FROM CUSTOMERS 
WHERE AGE = 25 ORDER BY NAME DESC;

输出

以下是上述查询的输出:

ID 姓名 年龄 地址 薪水
2 Khilan 25 德里 1500.00
4 Chaitali 25 孟买 6500.00

带有 LIMIT 子句的 ORDER BY

我们可以将 LIMIT 子句与 ORDER BY 子句一起使用,通过按升序或降序排序来限制指定的行数。

语法

以下是 MySQL 数据库中使用 LIMIT 子句与 ORDER BY 子句的语法:

SELECT column1, column2, ...
FROM table_name
ORDER BY column_name1 [ASC | DESC], column_name2 [ASC | DESC], ...
LIMIT N;

示例

在这里,我们根据薪水从 CUSTOMERS 表中检索前 4 条记录,并根据其名称按升序对其进行排序:

SELECT SALARY FROM CUSTOMERS ORDER BY NAME LIMIT 4;

输出

以下是上述查询的输出:

薪水
6500.00
8500.00
2000.00
1500.00

按首选顺序排序结果

还可以使用 ORDER BY 子句中的CASE语句按自己的首选顺序对表的记录进行排序。所有值都与它们应该排序的位置一起在子句中指定;如果没有给出任何数字,则它们将自动按升序排序。

示例

要按自己的首选顺序获取行,使用的 SELECT 查询如下:

SELECT * FROM CUSTOMERS ORDER BY (
CASE ADDRESS
   WHEN 'MUMBAI' THEN 1
   WHEN 'DELHI' THEN 2
   WHEN 'HYDERABAD' THEN 3
   WHEN 'AHMEDABAD' THEN 4
   WHEN 'INDORE' THEN 5
   WHEN 'BHOPAL' THEN 6
   WHEN 'KOTA' THEN 7
   ELSE 100 END
);

输出

上述查询根据使用 CASE 语句定义的自定义顺序对 CUSTOMERS 表进行排序。在这里,我们根据 ADDRESS 列中指定的城市的居民人口对记录进行排序。

ID 姓名 年龄 地址 薪水
4 Chaitali 25 孟买 6500.00
2 Khilan 25 德里 1500.00
6 Komal 22 海得拉巴 4500.00
1 Ramesh 32 艾哈迈达巴德 2000.00
7 Muffy 24 因多尔 10000.00
5 Hardik 27 博帕尔 8500.00
3 Kaushik 23 科塔 2000.00
广告