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
廣告