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

今天,我們將瞭解在 MySQL 中使用多列的 ORDER BY
子句。
MySQL 中的 ORDER BY
子句
每當我們使用 SELECT
語句從表中檢索資料時,輸出中記錄(行)的順序是未指定的。要對其進行排序,我們可以將 ORDER BY
子句與 SELECT
語句結合使用。
使用 ORDER BY
子句,我們可以使用 ASC
(升序)和 DESC
(降序)選項對從一列或多列檢索的資料進行升序或降序排序。
如果我們不指定選項(ASC
或 DESC
),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 |
讓我們使用帶有 ASC
和 DESC
選項的 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;
輸出:
ORDER BY
子句使用 FIRSTNAME
列按升序對資料進行排序。此外,它使用 LASTNAME
列按升序對已排序的資料進行排序。
值得注意的一點是如何使用多列對資料進行排序。
資料將分兩步排序,我們使用兩列對資料進行排序。
- 結果集使用
FIRSTNAME
列按升序排序。 - 如果
FIRSTNAME
列中的兩個或多個值相同,則LASTNAME
將按這些記錄的升序排序。請參閱上述輸出中的紅色框。
類似地,我們可以通過在每一列中用 DESC
選項替換 ASC
來按降序對資料進行排序。下面是另一個示例,我們需要按降序對 FIRSTNAME
列和按升序對 LASTNAME
列進行排序。
示例程式碼:
SELECT * FROM db_ms20.tb_students ORDER BY FIRSTNAME DESC, LASTNAME ASC;
輸出:
在這裡,ORDER BY
將按如下方式對資料進行排序:
-
首先,資料將使用
FIRSTNAME
列按降序排序。 -
其次,已經排序的資料將使用
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];