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 子句中使用多个列,但我们需要确保用于排序的列在列列表中指定。

带 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 拉梅什 32 艾哈迈达巴德 2000.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00

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

SELECT * FROM CUSTOMERS ORDER BY NAME ASC;

输出

这将产生以下结果 -

ID 姓名 年龄 地址 薪水
4 柴塔利 25 孟买 6500.00
5 哈迪克 27 博帕尔 8500.00
3 考希克 23 科塔 2000.00
2 基兰 25 德里 1500.00
6 科马尔 22 海得拉巴 4500.00
7 莫菲 24 印多尔 10000.00
1 拉梅什 32 艾哈迈达巴德 2000.00

带 DESC 的 ORDER BY 子句

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

例子

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

SELECT * FROM CUSTOMERS ORDER BY NAME DESC;

输出

这将产生如下结果 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
7 莫菲 24 印多尔 10000.00
6 科马尔 22 海得拉巴 4500.00
2 基兰 25 德里 1500.00
3 考希克 23 科塔 2000.00
5 哈迪克 27 博帕尔 8500.00
4 柴塔利 25 孟买 6500.00

多列上的 ORDER BY 子句

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

例子

在下面的查询中,我们从 CUSTOMERS 表中检索所有记录,并首先按地址升序对它们进行排序,然后按工资降序排列 -

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

输出

以下是产生的结果 -

ID 姓名 年龄 地址 薪水
6 科马尔 22 海得拉巴 4500.00
3 考希克 23 科塔 2000.00
7 莫菲 24 印多尔 10000.00
4 柴塔利 25 孟买 6500.00
2 基兰 25 德里 1500.00
5 哈迪克 27 博帕尔 8500.00
1 拉梅什 32 艾哈迈达巴德 2000.00

带 WHERE 子句的 ORDER BY

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

例子

现在,我们从 CUSTOMERS 表中检索客户年龄为 25 岁的所有记录,并按照姓名的降序对它们进行排序 -

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

输出

以下是上述查询的输出 -

ID 姓名 年龄 地址 薪水
2 基兰 25 德里 1500.00
4 柴塔利 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 柴塔利 25 孟买 6500.00
2 基兰 25 德里 1500.00
6 科马尔 22 海得拉巴 4500.00
1 拉梅什 32 艾哈迈达巴德 2000.00
7 莫菲 24 印多尔 10000.00
5 哈迪克 27 博帕尔 8500.00
3 考希克 23 科塔 2000.00