在 MySQL 中对多列使用 ORDER BY 子句

Mehvish Ashiq 2023年1月30日 2022年5月13日
  1. MySQL 中的 ORDER BY 子句
  2. 在 MySQL 中对多列使用 ORDER BY 子句
在 MySQL 中对多列使用 ORDER BY 子句

今天,我们将了解在 MySQL 中使用多列的 ORDER BY 子句。

MySQL 中的 ORDER BY 子句

每当我们使用 SELECT 语句从表中检索数据时,输出中记录(行)的顺序是未指定的。要对其进行排序,我们可以将 ORDER BY 子句与 SELECT 语句结合使用。

使用 ORDER BY 子句,我们可以使用 ASC(升序)和 DESC(降序)选项对从一列或多列检索的数据进行升序或降序排序。

如果我们不指定选项(ASCDESC),ORDER BY 子句使用默认选项 ASC 按升序对数据进行排序。因此,我们使用以下查询得到相同的结果,因为两者是等价的。

#following both queries are equivalent
SELECT selectlist FROM tablename ORDER BY column1;
SELECT selectlist FROM tablename ORDER BY column1 ASC;

我们在 ORDER BY 子句之后只写一列,以使用一列对数据进行排序。否则,写入多个以逗号分隔的列。

请参阅以下代码行。

#sort data in ascending order by using one column
SELECT selectlist FROM tablename ORDER BY column1 ASC;

#sort data in descending order by using multiple columns
SELECT selectlist FROM tablename ORDER BY column1 DESC, column2 DESC;

在 MySQL 中对多列使用 ORDER BY 子句

要学习 ORDER BY 子句的使用,我们必须有一个表。出于这个原因,我们在 db_ms20 数据库中创建了一个名为 tb_students 的表,其中 tb 是表的前缀,db 是数据库的前缀。

这不是强制性的,而是一种很好的方法来区分具有确切名称的表和数据库。

示例代码(创建和填充表 tb_students):

#create a database
CREATE SCHEMA `db_ms20` ;

#create a table
CREATE TABLE `db_ms20`.`tb_students` (
    `ID` INT NOT NULL AUTO_INCREMENT,
    `FIRSTNAME` VARCHAR(45) NOT NULL,
    `LASTNAME` VARCHAR(45) NOT NULL,
    PRIMARY KEY (`ID`));

#insert data into a table
INSERT INTO db_ms20.tb_students (FIRSTNAME, LASTNAME) VALUES
('Thomas', 'Christoper'),
('Thomas', 'Jorge'),
('Mehvish', 'Ashiq'),
('Johny', 'James'),
('Daniel', 'Glass'),
('Debbra', 'Herring'),
('Daniel', 'Costner');

#select all data from the table
SELECT * FROM db_ms20.tb_students;

输出(tb_students 表的数据):

| ID   | FIRSTNAME | LASTNAME   |
| ---- | --------- | ---------- |
| 1    | Thomas    | Christoper |
| 2    | Thomas    | Jorge      |
| 3    | Mehvish   | Ashiq      |
| 4    | Johny     | James      |
| 5    | Daniel    | Glass      |
| 6    | Debbra    | Herring    |
| 7    | Daniel    | Costner    |

让我们使用带有 ASCDESC 选项的 ORDER BY 子句将结果集按升序或降序排序。

示例代码:

SELECT * FROM db_ms20.tb_students ORDER BY FIRSTNAME, LASTNAME;

# we can use the following query as an alternative
# for getting the same output
SELECT * FROM db_ms20.tb_students ORDER BY FIRSTNAME ASC, LASTNAME ASC;

输出:

在 mysql 中使用带有多列的 order by 子句 - 输出一

ORDER BY 子句使用 FIRSTNAME 列按升序对数据进行排序。此外,它使用 LASTNAME 列按升序对已排序的数据进行排序。

值得注意的一点是如何使用多列对数据进行排序。

数据将分两步排序,我们使用两列对数据进行排序。

  1. 结果集使用 FIRSTNAME 列按升序排序。
  2. 如果 FIRSTNAME 列中的两个或多个值相同,则 LASTNAME 将按这些记录的升序排序。请参阅上述输出中的红色框。

类似地,我们可以通过在每一列中用 DESC 选项替换 ASC 来按降序对数据进行排序。下面是另一个示例,我们需要按降序对 FIRSTNAME 列和按升序对 LASTNAME 列进行排序。

示例代码:

SELECT * FROM db_ms20.tb_students ORDER BY FIRSTNAME DESC, LASTNAME ASC;

输出:

在 mysql 中使用带有多列的 order by 子句 - 输出二

在这里,ORDER BY 将按如下方式对数据进行排序:

  1. 首先,数据将使用 FIRSTNAME 列按降序排序。

  2. 其次,已经排序的数据将使用 LASTNAME 列按升序排序,而不更改 FIRSTNAME 列中的值顺序。这意味着如果 FIRSTNAME 列中的两个或多个值相同,LASTNAME 将按升序排序。

    请参阅红色矩形以了解。

请记住,如果你的数据集中有 NULL 值,那么 NULLS FIRST(将 non-NULL 值放在 NULL 值之后)和 NULLS LAST(将 NULL 值放在 non-NULL 值)选项可按如下方式使用:

SELECT selectlist FROM tablename
ORDER BY
column1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
column2 [ASC | DESC] [NULLS FIRST | NULLS LAST];
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

相关文章 - MySQL Column